postgresql
Triggers en triggerfuncties
Zoeken…
Invoering
De trigger wordt gekoppeld aan de opgegeven tabel of weergave en voert de opgegeven functie functienaam uit wanneer zich bepaalde gebeurtenissen voordoen.
Opmerkingen
Gebruik onderstaande link voor een compleet overzicht van:
Basic PL / pgSQL-triggerfunctie
Dit is een eenvoudige triggerfunctie.
CREATE OR REPLACE FUNCTION my_simple_trigger_function()
RETURNS trigger AS
$BODY$
BEGIN
-- TG_TABLE_NAME :name of the table that caused the trigger invocation
IF (TG_TABLE_NAME = 'users') THEN
--TG_OP : operation the trigger was fired
IF (TG_OP = 'INSERT') THEN
--NEW.id is holding the new database row value (in here id is the id column in users table)
--NEW will return null for DELETE operations
INSERT INTO log_table (date_and_time, description) VALUES (now(), 'New user inserted. User ID: '|| NEW.id);
RETURN NEW;
ELSIF (TG_OP = 'DELETE') THEN
--OLD.id is holding the old database row value (in here id is the id column in users table)
--OLD will return null for INSERT operations
INSERT INTO log_table (date_and_time, description) VALUES (now(), 'User deleted.. User ID: ' || OLD.id);
RETURN OLD;
END IF;
RETURN null;
END IF;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
Deze triggerfunctie toevoegen aan de users
CREATE TRIGGER my_trigger
AFTER INSERT OR DELETE
ON users
FOR EACH ROW
EXECUTE PROCEDURE my_simple_trigger_function();
Type triggers
Trigger kan worden opgegeven om te schieten:
-
BEFORE
de bewerking op een rij wordt geprobeerd - invoegen, bijwerken of verwijderen; -
AFTER
de bewerking is voltooid - invoegen, bijwerken of verwijderen; -
INSTEAD OF
de bewerking in het geval van invoegingen, updates of verwijderingen in een weergave.
Trekker die is gemarkeerd:
-
FOR EACH ROW
wordt eenmaal aangeroepen voor elke rij die de bewerking wijzigt; -
FOR EACH STATEMENT
wordt onde genoemd voor een bepaalde bewerking.
Voorbereiding op het uitvoeren van voorbeelden
CREATE TABLE company (
id SERIAL PRIMARY KEY NOT NULL,
name TEXT NOT NULL,
created_at TIMESTAMP,
modified_at TIMESTAMP DEFAULT NOW()
)
CREATE TABLE log (
id SERIAL PRIMARY KEY NOT NULL,
table_name TEXT NOT NULL,
table_id TEXT NOT NULL,
description TEXT NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
)
Enkele insteektrekker
Stap 1: maak uw functie
CREATE OR REPLACE FUNCTION add_created_at_function()
RETURNS trigger AS $BODY$
BEGIN
NEW.created_at := NOW();
RETURN NEW;
END $BODY$
LANGUAGE plpgsql;
Stap 2: maak uw trigger
CREATE TRIGGER add_created_at_trigger
BEFORE INSERT
ON company
FOR EACH ROW
EXECUTE PROCEDURE add_created_at_function();
Stap 3: Test het
INSERT INTO company (name) VALUES ('My company');
SELECT * FROM company;
Trekker voor meerdere doeleinden
Stap 1: maak uw functie
CREATE OR REPLACE FUNCTION add_log_function()
RETURNS trigger AS $BODY$
DECLARE
vDescription TEXT;
vId INT;
vReturn RECORD;
BEGIN
vDescription := TG_TABLE_NAME || ' ';
IF (TG_OP = 'INSERT') THEN
vId := NEW.id;
vDescription := vDescription || 'added. Id: ' || vId;
vReturn := NEW;
ELSIF (TG_OP = 'UPDATE') THEN
vId := NEW.id;
vDescription := vDescription || 'updated. Id: ' || vId;
vReturn := NEW;
ELSIF (TG_OP = 'DELETE') THEN
vId := OLD.id;
vDescription := vDescription || 'deleted. Id: ' || vId;
vReturn := OLD;
END IF;
RAISE NOTICE 'TRIGER called on % - Log: %', TG_TABLE_NAME, vDescription;
INSERT INTO log
(table_name, table_id, description, created_at)
VALUES
(TG_TABLE_NAME, vId, vDescription, NOW());
RETURN vReturn;
END $BODY$
LANGUAGE plpgsql;
Stap 2: maak uw trigger
CREATE TRIGGER add_log_trigger
AFTER INSERT OR UPDATE OR DELETE
ON company
FOR EACH ROW
EXECUTE PROCEDURE add_log_function();
Stap 3: Test het
INSERT INTO company (name) VALUES ('Company 1');
INSERT INTO company (name) VALUES ('Company 2');
INSERT INTO company (name) VALUES ('Company 3');
UPDATE company SET name='Company new 2' WHERE name='Company 2';
DELETE FROM company WHERE name='Company 1';
SELECT * FROM log;
Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow