web-dev-qa-db-fra.com

Créer ou remplacer des postgres déclencheurs

Je veux "créer ou remplacer" un déclencheur pour une table postgres. Cependant, il n'y a pas une telle expression SQL.

Je vois que je peux faire un "DROP TRIGGER SI EXISTS" en premier ( http://www.postgresql.org/docs/9.5/static/sql-droptrigger.html ).

Ma question est:

  1. Existe-t-il une option recommandée/meilleure que (déclencheur DROP + CREATE)
  2. Y a-t-il une raison pour laquelle il n'y a pas un tel "déclencheur de création ou de remplacement" (ce qui pourrait impliquer que je ne devrais pas vouloir le faire)

Notez qu’il existe un "déclencheur de création ou de remplacement" dans Oracle ( https://docs.Oracle.com/cd/B19306_01/appdev.102/b14251/adfns_triggers.htm ). Ensuite,

  1. Une telle commande est-elle prévue pour Postgres?
42
jbarrameda

Postres a la transaction DDL donc BEGIN > DROP > CREATE > COMMIT is the equivalent ofCREATE OR REMPLACER`

https://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis est un bon résumé de la manière dont le DDL transactionnel de Postgre se compare à d'autres systèmes (comme Oracle)

Les fonctionnalités actuellement prévues par Postgres concernant les déclencheurs ( https://wiki.postgresql.org/wiki/Todo#Triggers ) n'incluent pas l'ajout de la syntaxe REPLACE.

20
Krut

Aucun moyen de créer ou de remplacer un déclencheur mais peut le faire de cette façon

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

Vous devez utiliser deux instructions: une pour déclencher un déclencheur et une autre pour créer un déclencheur.

Exemple:

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

vous pouvez utiliser le code ci-dessous.

DO $$ BEGIN

CREATE (trigger, type , ...);

EXCEPTION
  WHEN others THEN null;
END $$;

échantillon:

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