PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Gibt es eine Möglichkeit, Aktualisierungen/Löschvorgänge zu deaktivieren, aber dennoch Auslösern zu erlauben, sie auszuführen?

Ja, das ist möglich.

Trigger werden mit den Privilegien der Triggerfunktion ausgeführt, standardmäßig SECURITY INVOKER Das heißt, die Triggerfunktion wird effektiv mit den Rechten des current_user ausgeführt , in Ihrem Fall derjenige, der Zeilen einfügt.

Wenn der aktuelle Benutzer nicht über die erforderlichen Berechtigungen für die Tabellen verfügt, auf denen Ihre Triggerfunktion operiert, schlägt Ihre ursprüngliche Operation in der zugrunde liegenden Tabelle fehl.

Allerdings , können Sie SECURITY DEFINER verwenden damit die Triggerfunktion diese Funktion mit den Privilegien des OWNER ausführen kann der Funktion.

Wenn Sie einen Superuser eigenen haben die Triggerfunktion, sie kann alles - was ein mögliches Sicherheitsrisiko darstellen würde. Beachten Sie die Anweisungen im Handbuch zum Schreiben von SECURITY DEFINER Funktioniert sicher.

Aber es ist klüger, eine einfache Rolle mit nur den notwendigen Privilegien OWNER zu machen der Triggerfunktion. Sie können sogar einfach eine "Daemon"-Rolle ohne Anmeldung erstellen, die als Berechtigungspaket für solche Operationen fungiert. Sie würden dieser Daemon-Rolle dann nur die erforderlichen Berechtigungen (für Schemas, Tabellen, Sequenzen ...) erteilen. Für ausgefeiltere Designs sollten Sie Berechtigungen in "Gruppenrollen" bündeln (wiederum kein Login) und diese Gruppenrollen den Rollen zuweisen, die sie benötigen (in diesem Beispiel der Daemon-Rolle), wodurch sie effektiv zu "Mitgliedern der Gruppe" werden. Das mache ich oft.

Betrachten Sie diese verwandte Antwort auf dba.SE bezüglich der Berechtigungen für die Funktion selbst:

  • Welche Berechtigungen sind erforderlich, um eine Triggerfunktion in PostgreSQL 8.4 auszuführen?