Привилегии выполнения SQL кода
Все объекты метаданных содержащие DML или PSQL код могут выполняться в одном из следующих режимов:
-
С привилегиями вызывающего пользователя (привилегии
CURRENT_USER
); -
С привилегиями определяющего пользователя (владельца объекта метаданных).
Исторически сложилось, что все PSQL модули по умолчанию выполняются с привилегиями вызывающего пользователя.Начиная с Firebird 4.0 появилась возможность указывать объектам метаданных с какими привилегиями они будут выполняться: вызывающего или определяющего пользователя.Для этого используется предложение SQL SECURITY
, которое можно указать для таблицы, триггера, процедуры, функции или пакета.Если выбрана опция INVOKER
, то объект метаданных будет выполняться с привилегиями вызывающего пользователя.Если выбрана опция DEFINER
, то объект метаданных будет выполняться с привилегиями определяющего пользователя (владельца). Эти привилегии будут дополнены привилегиями выданные самому PSQL модулю с помощью оператора GRANT.
Привилегии выполнения, с которым по умолчанию (не указано у самого модуля) выполняется любой PSQL модуль можно изменить с помощью оператора
ALTER DATABASE SET DEFAULT SQL SECURITY {DEFINER | INVOKER}
Для сохранения обратной совместимости по умолчанию используется опция INVOKER.
Note
|
Замечания
|
В хранимых процедурах, функциях и триггерах вы можете проверить эффективного в настоящий момент пользователя, т.е.пользователя с привилегиями которого выполняется текущий модуль, с помощью системной контекстной переменной EFFECTIVE_USER
из пространства имён SYSTEM
.
select RDB$GET_CONTEXT('SYSTEM', 'EFFECTIVE_USER') from RDB$DATABASE;
Note
|
Один и тот же объект может вызываться в разных контекстах безопасности и требовать различных привилегий.Например, у нас есть:
Если пользователь Если пользователь |