Да, това е възможно.
Тригерите се изпълняват с привилегиите на функцията за задействане, като по подразбиране е SECURITY INVOKER
което означава, че функцията за задействане се изпълнява ефективно с привилегиите на current_user
, във вашия случай този, който вмъква редове.
Ако текущият потребител няма необходимите привилегии за таблиците, с които работи вашата функция за задействане, първоначалната ви операция в основната таблица ще изпадне в грешка.
Въпреки това , можете да използвате SECURITY DEFINER
за функцията за задействане да изпълнява тази функция с привилегиите на OWNER
на функцията.
Ако имате собствен суперпотребител функцията за задействане, може да направи всичко - което би било възможна опасност за сигурността. Обърнете внимание на инструкциите в ръководството за писане на SECURITY DEFINER
Функционира безопасно.
Но е по-разумно да направите обикновена роля само с необходимите привилегии OWNER
на функцията за задействане. Можете дори просто да създадете роля "демон" без влизане, действаща като пакет с привилегии за такива операции. След това ще предоставите само необходимите привилегии (върху схеми, таблици, последователности ...) на тази роля на демон. За по-сложни дизайни трябва да обедините привилегиите в „групови роли“ (отново без вход) и да предоставите тези групови роли на ролите, които се нуждаят от това (на ролята на демон в този пример), като ефективно ги правите „членове на групата“. Правя го много.
Помислете за този свързан отговор на dba.SE относно привилегиите на самата функция:
- Какви са привилегиите, необходими за изпълнение на функция за задействане в PostgreSQL 8.4?