Tak, jest to możliwe.
Wyzwalacze działają z uprawnieniami funkcji wyzwalającej, domyślnie są to SECURITY INVOKER
, co oznacza, że funkcja wyzwalacza jest skutecznie wykonywana z uprawnieniami użytkownika current_user
, w tym przypadku wstawiając wiersze.
Jeśli bieżący użytkownik nie ma wymaganych uprawnień dla tabel, na których działa funkcja wyzwalacza, pierwotna operacja w tabeli podstawowej spowoduje błąd.
Jednak, można użyć SECURITY DEFINER
dla funkcji wyzwalania mieć ten bieg funkcji z uprawnieniami OWNER
funkcji.
Jeśli masz SUPERUŻYTKOWNIK własny funkcję wyzwalania, może to zrobić wszystko - co byłoby możliwe zagrożenia bezpieczeństwa. Rozważ instrukcje zawarte w instrukcji na temat Writing SECURITY DEFINER
Functions Safely.
Jednak rozsądniej jest wykonać prostą funkcję z niezbędnymi uprawnieniami OWNER
funkcji wyzwalacza. Możesz nawet utworzyć rolę "demona" bez logowania, działając jako pakiet uprawnień dla takich operacji. Następnie można nadać tylko tę dostępną rolę (schematom, tabelom, sekwencjom ...) tej roli demona. Aby uzyskać bardziej wyrafinowane projekty, powinieneś zawrzeć przywileje w "rolach grupowych" (ponownie, bez logowania) i nadać te role grupowe rolom, które ich potrzebują (do roli demona w tym przykładzie), skutecznie czyniąc je "członkami grupy". Robię to bardzo.
Należy również rozważyć this related question on dba.SE dotyczące uprawnień do samej funkcji.
Jeśli twój wyzwalacz aktualizuje wiersze, które są wstawiane - jest to znak złego projektu. Czy możesz pokazać niektóre z twoich spustów lub powiedzieć, co z nimi robisz? –
Jeśli chcesz "zaktualizować określone pole" wstawionego rekordu - możesz po prostu przypisać żądaną wartość do "NEW.specific_field". Nie potrzebujesz osobnej aktualizacji. –
Nie zaprojektowałem tego, ale nie wiem, czy zrobiłbym coś lepszego, aby być szczerym. Nie spojrzałem jeszcze na wyzwalacze. Może mógłbym tego użyć, nie wiem. Dam ci znać. Dzięki – Paco