postgresql
Trigger- und Triggerfunktionen
Suche…
Einführung
Der Trigger wird der angegebenen Tabelle oder Sicht zugeordnet und führt die angegebene Funktion Funktionsname aus, wenn bestimmte Ereignisse auftreten.
Bemerkungen
Bitte benutzen Sie den untenstehenden Link für eine vollständige Übersicht über:
Grundlegende PL / pgSQL-Triggerfunktion
Dies ist eine einfache Triggerfunktion.
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;
Hinzufügen dieser Auslöserfunktion zur users
CREATE TRIGGER my_trigger
AFTER INSERT OR DELETE
ON users
FOR EACH ROW
EXECUTE PROCEDURE my_simple_trigger_function();
Art der Auslöser
Auslöser kann zum Auslösen angegeben werden:
-
BEFORE
der Vorgang in einer Zeile versucht wird - Einfügen, Aktualisieren oder Löschen. -
AFTER
der Vorgang abgeschlossen ist - Einfügen, Aktualisieren oder Löschen. -
INSTEAD OF
the operation bei Einfügungen, Aktualisierungen oder Löschungen in einer Ansicht.
Auslöser, der markiert ist:
-
FOR EACH ROW
heißt einmal für jede Zeile , dass die Operation modifiziert; -
FOR EACH STATEMENT
wird für jede gegebene Operation aufgerufen.
Beispiele für die Ausführung vorbereiten
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()
)
Single-Insert-Abzug
Schritt 1: Erstellen Sie Ihre Funktion
CREATE OR REPLACE FUNCTION add_created_at_function()
RETURNS trigger AS $BODY$
BEGIN
NEW.created_at := NOW();
RETURN NEW;
END $BODY$
LANGUAGE plpgsql;
Schritt 2: Erstellen Sie Ihren Abzug
CREATE TRIGGER add_created_at_trigger
BEFORE INSERT
ON company
FOR EACH ROW
EXECUTE PROCEDURE add_created_at_function();
Schritt 3: testen Sie es
INSERT INTO company (name) VALUES ('My company');
SELECT * FROM company;
Auslöser für mehrere Zwecke
Schritt 1: Erstellen Sie Ihre Funktion
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;
Schritt 2: Erstellen Sie Ihren Abzug
CREATE TRIGGER add_log_trigger
AFTER INSERT OR UPDATE OR DELETE
ON company
FOR EACH ROW
EXECUTE PROCEDURE add_log_function();
Schritt 3: testen Sie es
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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow