Funkcje wyzwalacza zachowują się tak samo, jak inne funkcje w zakresie uprawnień. Z drobnym wyjątkiem:
Aby utworzyć wyzwalacz dla tabeli, użytkownik musi mieć TRIGGER
uprawnienia do tabeli. Użytkownik musi również mieć EXECUTE
uprawnienia do funkcji wyzwalacza.
AKTUALIZACJA
Po otrzymaniu opinii w komentarzach przeprowadziłem kilka badań. Na Wiki Postgres jest otwarty element DO ZROBIENIA:
Zaostrz sprawdzanie uprawnień do wyzwalania
Powiązany z tym wątkiem na temat hakerów Postgres . Obecnie EXECUTE
uprawnienia do funkcji wyzwalacza są sprawdzane tylko w czasie tworzenia wyzwalacza , ale nie w czasie wykonywania. Dlatego odwołanie instrukcji EXECUTE w funkcji wyzwalacza nie ma wpływu na wyzwalacz po utworzeniu. Twoja obserwacja wydaje się poprawna.
Nie daje to żadnych dodatkowych uprawnień do manipulowania obiektami. Jeśli rola wywołująca nie ma uprawnień niezbędnych do wykonania (części) treści funkcji, zgłaszany jest zwykły wyjątek. Aby utorować drogę, możesz uczynić uprzywilejowanego użytkownika OWNER
funkcji i użyć
SECURITY DEFINER
klauzula, jak udokumentowano w tym podręczniku tutaj . Powoduje, że funkcja jest uruchamiana z uprawnieniami właściciela zamiast wywołującego (domyślnie).
Jeśli właściciel jest superużytkownikiem, musisz szczególnie uważać, komu udzielasz EXECUTE
uprawnienia i co funkcja może zrobić, aby uniknąć nadużyć. Może chcesz
REVOKE ALL ON FUNCTION foo() FROM public;
na początek i użyj SET search_path
funkcji.
Przeczytaj rozdział Bezpieczne pisanie SECURITY DEFINER
funkcji .
Znajdź przykładowy kod w tej pokrewnej odpowiedzi na SO.
SECURITY DEFINER
, chcęSECURITY INVOKER
. Ale wydaje się (dla funkcji wyzwalacza, a nie dla zwykłej funkcji), że użycie domyślnej opcji (SECURITY INVOKER
) nie zachowuje się tak.NOTICE
. UsunąłemALL
uprawnienia odPUBLIC
i od właściciela funkcji. Następnie, jeśli użyję właściciela lub innej roli, która nie ma żadnych uprawnień do tej funkcji, powinienem oczekiwać błędu z powodu braku uprawnień, ale wszystko działa poprawnie.