私のテーブルには、更新を防ぐトリガーがあります。そのため、行は効果的に不変のポスト挿入になります。pg_class.relhastriggersは `ALTER TABLE ... DISABLE TRIGGER USER`の代わりに安全ですか?
(例えば新しい計算フィールドを追加)このテーブルを遡及更新を実行するために必要とする場合、私は、次のアプローチをとっている。
ALTER TABLE my_table DISABLE TRIGGER USER;
UPDATE my_table
SET x = (...);
ALTER TABLE my_table ENABLE TRIGGER USER;
このアプローチの欠点は、それがAccessExclusiveLockを必要とすることです。
私が使用するために、次はUPDATE
の行は、他のクエリによって更新されないことが保証されている与えられた、安全であれば、私は思っていた
:
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;
私がこれまで試してみましたが、このことを示唆していますこのトランザクションの外では、トリガーは正常に引き続き適用されます。
また、私の使用事例で実際に安全である場合、安全ではない状況は何ですか?
私はPostgres 9.4.8を使用しています。
おかげで、よりDISABLE TRIGGER ALL
のように動作しますrelhastriggers
を更新