Auf meinem Tisch habe ich einen Auslöser, der Updates verhindert, was bedeutet, dass Zeilen nach dem Einfügen effektiv unveränderbar sind.Ist pg_class.relhastriggers eine sichere Alternative zu `ALTER TABLE ... DISABLE TRIGGER USER`?
Wenn retrospektive Aktualisierungen zu dieser Tabelle auszuführen benötigen (zum Beispiel ein neues berechnetes Feld hinzufügen) ich folgende Vorgehensweise getroffen haben:
ALTER TABLE my_table DISABLE TRIGGER USER;
UPDATE my_table
SET x = (...);
ALTER TABLE my_table ENABLE TRIGGER USER;
Der Nachteil dieses Ansatzes ist, dass es eine AccessExclusiveLock erfordert.
Ich frage mich, ob die folgende sicher ist für mich gegeben zu verwenden, ist sichergestellt, dass die Zeilen in der UPDATE
werden von anderen Abfragen aktualisiert werden nicht:
BEGIN;
UPDATE pg_class
SET relhastriggers = FALSE
WHERE relname = 'my_table';
UPDATE my_table
SET x = (...);
UPDATE pg_class
SET relhastriggers = TRUE
WHERE relname = 'my_table';
COMMIT;
Was ich bisher versucht, legt dies nahe, ist sicher und außerhalb dieser Transaktion werden die Trigger weiterhin normal angewendet.
Auch, wenn es in der Tat sicher für meinen Anwendungsfall ist, unter welchen Umständen wäre es nicht sicher?
Ich benutze Postgres 9.4.8.
Danke :-)