PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Migration du déclencheur d'Oracle 11g vers Postgresql 8.4

Les déclencheurs dans Postgres ne fournissent pas de code de déclencheur directement, mais appellent une fonction de déclencheur , qui peuvent être appelés à partir de n'importe quel nombre de déclencheurs, bien qu'ils soient souvent personnalisés pour un événement particulier sur une table particulière.

Fonction déclencheur :

CREATE OR REPLACE FUNCTION trg_some_tbl_foo()
  RETURNS trigger AS
$func$
BEGIN

INSERT INTO some_tbl(key, name, describe)   -- or some_other_tbl?
VALUES (OLD.key, OLD.name, OLD.describe);

RETURN OLD;

END
$func$ LANGUAGE plpgsql 

Déclencheur :

CREATE TRIGGER foo         -- not:  "CREATE OR REPLACE" !
AFTER UPDATE OR DELETE ON some_tbl
FOR EACH ROW EXECUTE PROCEDURE trg_some_tbl_foo()
  • Faites-en un AFTER déclencheur pour simplifier. Un BEFORE le déclencheur devrait RETURN NEW pour que les mises à jour fonctionnent, mais NEW n'est pas visible dans un DELETE gâchette. Vous auriez donc besoin de IF TG_OP = ... etc.

  • Fournissez toujours une liste cible pour INSERT persistant déclarations. C'est tout aussi mauvais dans un déclencheur Oracle.

  • Vous avez probablement une table avec un serial colonne. Ne le mentionnez pas dans l'insert, l'identifiant suivant de la séquence est inséré automatiquement.

Il existe de nombreux exemples de code ici sur SO.