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

SQL-Trigger nur auslösen, wenn ein bestimmter Benutzer die Zeile aktualisiert

In neueren Postgres-Versionen gibt es ein when -Klausel, die Sie verwenden können, um den Trigger bedingt auszulösen. Sie könnten es wie folgt verwenden:

... when (old.* is distinct from new.*) ...

Ich bin mir nicht 100 % sicher, dass dies funktionieren wird (kann atm nicht testen):

... when (current_user = 'foo') ...

(Falls nicht, versuchen Sie es in einem if-Block in Ihrem plpgsql.)

http://www.postgresql.org/docs/current/static /sql-createtrigger.html

(Es gibt auch die [before|after] update of [col_name] Syntax, aber ich finde sie weniger nützlich, weil sie auch dann ausgelöst wird, wenn der Wert der Spalte gleich bleibt.)

Wenn Sie diese zusätzliche Notiz hinzufügen, sehen Sie, dass die Antwort von @CraigRinger hervorhebt, was Sie vorhaben ...

Der Versuch, eine Master-Master-Replikation zwischen Salesforce und Postgres mithilfe von bedingten Triggern einzurichten, ist meiner Meinung nach ein Wunschtraum. Vergiss es einfach... Es wird noch viel mehr dazugehören:Du musst Daten auf beiden Seiten entsprechend sperren (was nicht unbedingt vernünftig machbar sein wird), die resultierenden Deadlocks verwalten (was möglicherweise nicht automatisch erkannt) und Umgang mit widersprüchlichen Daten.

Ihre Chancen, dies mit einem winzigen Team erfolgreich durchzuziehen, liegen bei etwa null – insbesondere, wenn Ihre Postgres-Kenntnisse auf dem Niveau sind, auf dem das Investieren von Zeit in das Lesen des Handbuchs Ihre eigenen Fragen beantworten würde. Sie können mit Sicherheit darauf wetten, dass jemand, der bei Salesforce oder einem großen SQL-Shop (z. B. dem, für den Craig arbeitet) viel kompetenter ist, dasselbe betrachtet hat und entweder kläglich gescheitert ist oder es ausgeschlossen hat.

Darüber hinaus möchte ich betonen, dass die Implementierung einer effizienten, synchronen Multi-Master-Replikation nicht ist ein gelöstes Problem. Sie haben richtig gelesen:nicht gelöst. Noch vor ein paar Jahren, überhaupt war nicht gut genug gelöst, um es in den Postgres-Kern zu schaffen. Sie haben also keinen Stand der Technik, auf dem Sie Ihre Arbeit aufbauen und auf dem Sie iterieren können.