sql >> Database teknologi >  >> RDS >> PostgreSQL

Migrering af trigger fra Oracle 11g til Postgresql 8.4

Triggere i Postgres giver ikke triggerkode direkte, men kalder en triggerfunktion , som kan kaldes fra et vilkårligt antal triggere, selvom de ofte er tilpasset til en bestemt begivenhed på et bestemt bord.

Udløserfunktion:

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 

Trigger:

CREATE TRIGGER foo         -- not:  "CREATE OR REPLACE" !
AFTER UPDATE OR DELETE ON some_tbl
FOR EACH ROW EXECUTE PROCEDURE trg_some_tbl_foo()
  • Gør det til en AFTER trigger for at forenkle. En BEFORE trigger skal RETURN NEW for at få opdateringer til at virke, men NEW er ikke synlig i en DELETE udløser. Så du skal bruge IF TG_OP = ... osv.

  • Angiv altid en målliste for vedvarende INSERT udsagn. Dette er lige så slemt i en Oracle-trigger.

  • Du har sandsynligvis en tabel med en serial kolonne. Du skal bare ikke nævne det i indsættelsen, det næste id fra sekvensen indsættes automatisk.

Der er adskillige kodeeksempler her på SO.




  1. To genererede værdier i doktrin

  2. Kan ikke bruge None (NULL) værdier i python mysql.connector i forberedt INSERT-sætning

  3. Vis poster fra to tabeller side om side, der kun matcher nogle af felterne

  4. Kan kommentarer hæmme ydeevnen af ​​lagrede procedurer?