Функції тригера поводяться так само, як і інші функції, що стосується привілеїв. За незначним винятком:
Щоб створити тригер на столі, користувач повинен мати TRIGGER
привілей на стіл. Користувач також повинен мати EXECUTE
привілей на функцію тригера.
ОНОВЛЕННЯ
Після відгуків у коментарях я провів кілька досліджень. У Вікі Postgres є відкритий пункт TODO:
Затягніть перевірки дозволу на тригер
Пов’язане з цією темою на хакерах Postgres . В даний час EXECUTE
привілеї функції тригера перевіряються лише під час створення тригера , але не під час виконання. Таким чином, відкликання EXECUTE на функцію тригера не впливає на щойно створений тригер. Ваше спостереження здається правильним.
Це не дає додаткових привілеїв для маніпулювання об'єктами. Якщо в ролі виклику відсутні привілеї, необхідні для виконання (частин) тіла функції, звичайний виняток піднімається. Щоб прокласти шлях, ви можете зробити привілейованого користувача OWNER
функції та використовувати
SECURITY DEFINER
пункт, як це зафіксовано в посібнику, розміщеному тут . Це призводить до запуску функції з дозволами власника замість виклику (за замовчуванням).
Якщо власник є супер-користувачем, вам потрібно бути особливо обережним, кому ви надаєте EXECUTE
привілей, і що функція може зробити, щоб уникнути зловживань. Ви можете захотіти
REVOKE ALL ON FUNCTION foo() FROM public;
для початку і використання SET search_path
для функції.
Обов’язково прочитайте розділ про написання SECURITY DEFINER
функцій .
Знайдіть приклад коду в цій відповіді на відповідь.
SECURITY DEFINER
, я хочуSECURITY INVOKER
. Але здається (для функції тригера, а не для звичайної функції), що використовуючи параметр за замовчуванням (SECURITY INVOKER
), він не діє так.