sql >> Databasteknik >  >> RDS >> PostgreSQL

Migrerar trigger från Oracle 11g till Postgresql 8.4

Triggers i Postgres tillhandahåller inte triggerkod direkt, utan anropar en triggerfunktion , som kan anropas från valfritt antal utlösare, även om de ofta är anpassade för en viss händelse på ett visst bord.

Triggerfunktion:

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 till en AFTER utlösare för att förenkla. En BEFORE triggern måste RETURN NEW för att få uppdateringar att fungera, men NEW är inte synlig i en DELETE utlösare. Så du skulle behöva IF TG_OP = ... etc.

  • Ange alltid en mållista för beständig INSERT uttalanden. Detta är lika illa i en Oracle-utlösare.

  • Du har förmodligen en tabell med en serial kolumn. Nämn det bara inte i infogningen, nästa id från sekvensen infogas automatiskt.

Det finns många kodexempel här på SO.




  1. Dynamiska kolumnnamn i vy (Postgres)

  2. Hur gör man en riktig mysqli-förlängningsklass med förberedda uttalanden?

  3. Hur kan jag se SQL-exekveringsplanen i Oracle?

  4. Vad betyder pipe/veritcal bar-tecken i TSQL?