sql >> Database >  >> RDS >> PostgreSQL

Trigger migreren van Oracle 11g naar Postgresql 8.4

Triggers in Postgres leveren niet direct triggercode, maar roepen een triggerfunctie aan , die kan worden aangeroepen vanaf een willekeurig aantal triggers, hoewel ze vaak zijn aangepast voor een bepaalde gebeurtenis op een bepaalde tafel.

Trigger-functie:

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()
  • Maak er een AFTER van trigger om te vereenvoudigen. Een BEFORE trigger zou moeten RETURN NEW om updates te laten werken, maar NEW is niet zichtbaar in een DELETE trekker. Je hebt dus IF TG_OP = ... . nodig enz.

  • Geef altijd een doellijst op voor persistente INSERT verklaringen. Dit is net zo erg in een Oracle-trigger.

  • Je hebt waarschijnlijk een tabel met een serial kolom. Vermeld het alleen niet in de bijlage, de volgende id uit de reeks wordt automatisch ingevoegd.

Er zijn talloze codevoorbeelden hier op SO.




  1. Atomisch ingestelde SERIAL-waarde bij het plegen van transactie

  2. Python MySQL-connector retourneert bytearray in plaats van normale tekenreekswaarde

  3. Wat is een goede manier om alle witruimtetekens van een string in T-SQL zonder UDF en zonder CLR te trimmen?

  4. Urdu-tekens opslaan in MySQL