Блог

    Caché (Кашэ́) — промышленная высокопроизводительная, объектная система управления базами данных, интегрированная с технологией разработки веб-приложений. Единая архитектура данных Caché позволяет разработчикам использовать одновременно объектный, реляционный (SQL) и прямой (NoSQL) доступ к одним и тем же данным, хранение которых обеспечивается ориентированным на транзакции многомерным ядром СУБД.

    http://www.intersystems.ru/cache/

Последние записи


Теги

Информация

Приостановка всех пользовательских процессов, запрет входа новых пользователей и многое другое

добавлено: 02 апр 19
понравилось:0
просмотров: 2693
комментов: 0

теги:

Автор: servit

Недавно возникла интересная задача: 21847083.

Итак, необходимо перезапустить СУБД.
Для запуска команды из самой СУБД можно воспользоваться функцией $zf(-100) - новым, безопасным аналогом функций $zf(-1)/$zf(-2), например:

cmd "ccontrol"
args(1) = "stopstart"
args(2) = $p($zu(86),"*",2) ; имя экземпляра
args(3) = "quietly"
d $ZF(-100,"/ASYNC",cmd,.args)

Но при ближайшем рассмотрении топика обнаружилось, что на самом деле автору
<...> нужно остановить все пользовательские процессы и запретить пользователям вход 21847245
Для этого можно воспользоваться изменением системных флагов уровня экземпляра, для манипулирования которыми есть несколько способов, а именно:
  • функции программы ^SWSET
  • соответствующие методы класса %SYSTEM.Util: {Check/Get/Set}Switch()
Т.е. конечный код мог бы выглядеть примерно так:
#include %systemInclude
n
try
{

 
$$$AddAllRoleTemporaryInTry
 n $namespace
   
 throw
:$SYSTEM.Util.GetSwitch(10) ##class(%Exception.SystemException).%New("Не удалось запретить доступ к глобалам")

 
d $SYSTEM.Util.SetSwitch(12,$$$YES),
   
$SYSTEM.Util.SetSwitch(10,$$$YES)
   
 
#; здесь делаем актуализацию системы: компиляция классов, модификация глобалов и т.д.
   
 
i="USER","SAMPLES","BLA-BLA-BLA" {
   
s $namespace=i
   
$$$ThrowOnError($system.OBJ.CompileAll("cu-d/multicompile=0"))
   
$$$ThrowOnError(##class(%Routine).CompileAll(3,,,,$$$NO))
   
&sql(REVOKE ALL PRIVILEGES ON * FROM _PUBLIC)
   &sql(
REVOKE EXECUTE ON * FROM _PUBLIC)
 }
   
}
catch(ex){
 
"ОШИБКА: "ex.DisplayString(),!
}

d $SYSTEM.Util.SetSwitch(10,$$$NO),
 
$SYSTEM.Util.SetSwitch(12,$$$NO)
Единственный минус данного решения - невозможность многопоточной компиляции, поскольку блокируется любой доступ к глобалам для всех процессов, кроме текущего.

Комментарии




Необходимо войти на сайт, чтобы оставлять комментарии