Triggerfunktionen verhalten sich in Bezug auf Berechtigungen genauso wie andere Funktionen. Mit einer kleinen Ausnahme:
Um einen Trigger für eine Tabelle zu erstellen, muss der Benutzer über die TRIGGER
Berechtigung für die Tabelle verfügen . Der Benutzer muss auch über EXECUTE
Berechtigungen für die Triggerfunktion verfügen.
UPDATE
Nach dem Feedback in den Kommentaren habe ich einige Nachforschungen angestellt. Es gibt ein offenes TODO-Element im Postgres-Wiki:
Ziehen Sie die Triggerberechtigungsprüfungen fest
Verknüpft mit diesem Thread über Postgres-Hacker . Derzeit EXECUTE
werden Berechtigungen für eine Trigger - Funktion nur überprüft bei Trigger erstellen Zeit, aber nicht zur Laufzeit. Das Widerrufen von EXECUTE für die Triggerfunktion hat also keine Auswirkung auf einen einmal erstellten Trigger. Ihre Beobachtung scheint richtig zu sein.
Dies gewährt keine zusätzlichen Berechtigungen zum Bearbeiten von Objekten. Wenn der aufrufenden Rolle die Berechtigungen fehlen, die zum Ausführen (von Teilen) des Funktionskörpers erforderlich sind, wird die übliche Ausnahme ausgelöst. Um den Weg zu ebnen, können Sie einen privilegierten Benutzer OWNER
der Funktion erstellen und die verwenden
SECURITY DEFINER
Klausel, wie im Handbuch hier dokumentiert . Dadurch wird die Funktion mit den Berechtigungen des Eigentümers anstelle des Aufrufers ausgeführt (Standard).
Wenn der Eigentümer ein Superuser ist, müssen Sie besonders vorsichtig sein, wem Sie das EXECUTE
Privileg gewähren und was die Funktion tun kann, um Missbrauch zu vermeiden. Du möchtest vielleicht
REVOKE ALL ON FUNCTION foo() FROM public;
zu Beginn und SET search_path
für die Funktion verwenden.
Lesen Sie unbedingt das Kapitel über das sichere Schreiben von SECURITY DEFINER
Funktionen .
Finden Sie ein Codebeispiel in dieser verwandten Antwort auf SO.
SECURITY DEFINER
, ich will einSECURITY INVOKER
. Es scheint jedoch (für die Triggerfunktion, nicht für die reguläre Funktion), dass die Verwendung der Standardoption (SECURITY INVOKER
) nicht so funktioniert.NOTICE
. Ich habeALL
Berechtigungen vomPUBLIC
und vom Eigentümer der Funktion entfernt. Wenn ich dann den Eigentümer oder eine andere Rolle verwende, die keine Berechtigung für diese Funktion hat, sollte ich einen Fehler aufgrund fehlender Berechtigungen erwarten, aber alles wird erfolgreich ausgeführt.