web-dev-qa-db-ja.com

トリガーpostgresを作成または置換する

Postgresテーブルのトリガーを「作成または置換」したい。ただし、そのようなSQL式はありません。

最初に「DRIG TRIGGER IF EXISTS」を実行できることがわかりました( http://www.postgresql.org/docs/9.5/static/sql-droptrigger.html )。

私の質問は:

  1. (DROP + CREATEトリガー)よりも推奨/優れたオプションはありますか
  2. そのような「トリガーの作成または置換」がない理由はありますか(それは、私がそれをしたくないことを意味するかもしれません)

Oracleには「トリガーの作成または置換」があることに注意してください( https://docs.Oracle.com/cd/B19306_01/appdev.102/b14251/adfns_triggers.htm )。次に、

  1. そのようなコマンドはPostgresで予定されていますか?
42
jbarrameda

PostresにはトランザクションDDLがあるため、BEGIN > DROP > CREATE > COMMIT is the equivalent ofCREATE OR REPLACE`

https://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis は、postgreのトランザクションDDLが他のシステム(Oracleなど)とどのように比較されるかについての素晴らしい記事です。

トリガーに関する現在のpostgres計画機能( https://wiki.postgresql.org/wiki/Todo#Triggers )には、REPLACE構文の追加が含まれていません

20
Krut

トリガーを作成または置換する方法はありませんが、この方法で行うことができます

DROP TRIGGER IF EXISTS yourtrigger_name on "yourschemaname"."yourtablename";
53
X-Coder

2つのステートメントを使用する必要があります。1つはドロップトリガー用、もう1つはトリガーの作成用です。

例:

DROP TRIGGER IF EXISTS my_trigger
  ON my_schema.my_table;
CREATE TRIGGER my_trigger
  BEFORE INSERT OR UPDATE
  ON my_schema.my_table
  FOR EACH ROW EXECUTE PROCEDURE my_schema.my_function();
10
Vlad Bezden

以下のコードを使用できます。

DO $$ BEGIN

CREATE (trigger, type , ...);

EXCEPTION
  WHEN others THEN null;
END $$;

サンプル:

DO $$ BEGIN

CREATE TRIGGER trigger_workIDExist
  BEFORE INSERT OR UPDATE ON "GalleryModel"
  FOR EACH ROW EXECUTE PROCEDURE check_workIDExist();

EXCEPTION
  WHEN others THEN null;
END $$;
1
Ali Bagheri