PG WORKSHOP

Triggers

MARTIN: LAV NOGLE EKSEMPLER (og giv sql-definitionen på triggere og trigger-functions)

  • Triggere i databasen aktiverer funktioner i forbindelse med begivenheder på databasen. I det følgende gennemgår vi tabel-triggere som aktiveres INSERT; UPDATE og DELETE statements
  • Principielt 3 typer triggere:
    • Before
    • After
    • Instead of

Before:

Typisk når "noget" skal laves om på de data, der ændres / sættes ind eller noget skal tilføjes.

Eksempel: Beregn arealet af en geometri ved hver INSERT/UPDATE

ALTER TABLE att0902.bygninger ADD COLUMN area double precision;

CREATE OR REPLACE FUNCTION calc_area()
RETURNS trigger AS
$BODY$
BEGIN
  NEW.area := st_area(NEW.geom);
  RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;

CREATE TRIGGER bygninger_area_trig BEFORE INSERT OR UPDATE ON att0902.bygninger
  FOR EACH ROW EXECUTE PROCEDURE calc_area();

SELECT * FROM att0902.bygninger ;

INSERT INTO att0902.bygninger(
            geom, "Info", "Objekttype", "Z", "Konverteret")
    VALUES (ST_GeomFromText('POLYGON((390309.70572787 7538535.16303447,390306.811436522 7538533.90329089,390307.759708616 7538531.72373453,390304.79120467 7538530.44399502,390308.015329789 7538522.94552131,390322.478540685 7538529.21424533,390319.097744523 7538536.62273735,390310.637508276 7538532.97348015,390309.70572787 7538535.16303447))',32622),
     '--', 'SKUR', 66.66, '20110110');
  • Eksempler:
    • Etabler centroide punkt når geometrien ændres indsættes
    • Implemente r forretningsregler (f.eks. "Arealet af en polygon må ikke være større end det definerede maksimum for objekttypen (defineret i en anden tabel)

After:

Typisk når "noget" skal tilføjes i forbindelse med en operation

  • Eksempel:
    • Vedligehold en "log" tabel over alle de operationer, der foretages

Instead of:

  • Eksempler:
    • I stedet for at indsætte en række i et view, indsæt i de underliggende tabeller
    • "Rejs" en fejl når det er forbudt at slette i en tabel (også for administrator)