postgresql
Wyzwalacze i funkcje wyzwalaczy
Szukaj…
Wprowadzenie
Wyzwalacz zostanie powiązany z określoną tabelą lub widokiem i wykona określoną funkcję nazwa_funkcji, gdy wystąpią określone zdarzenia.
Uwagi
Użyj poniższego linku, aby uzyskać pełny przegląd:
- Wyzwalacze : https://www.postgresql.org/docs/current/static/sql-createtrigger.html
- Funkcje wyzwalacza : https://www.postgresql.org/docs/current/static/plpgsql-trigger.html
Podstawowa funkcja wyzwalania PL / pgSQL
Jest to prosta funkcja wyzwalacza.
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;
Dodanie tej funkcji wyzwalacza do tabeli users
CREATE TRIGGER my_trigger
AFTER INSERT OR DELETE
ON users
FOR EACH ROW
EXECUTE PROCEDURE my_simple_trigger_function();
Rodzaj wyzwalaczy
Można użyć wyzwalacza do strzelania:
-
BEFORE
próbą wykonania operacji w wierszu - wstaw, aktualizuj lub usuń; -
AFTER
zakończeniu operacji - wstaw, zaktualizuj lub usuń; -
INSTEAD OF
operacji w przypadku wstawiania, aktualizacji lub usuwania w widoku.
Wyzwalacz oznaczony:
-
FOR EACH ROW
jest wywoływane raz dla każdego wiersza, który modyfikuje operacja; -
FOR EACH STATEMENT
jest wywoływane dla każdej operacji.
Przygotowanie do wykonania przykładów
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()
)
Spust z pojedynczą wkładką
Krok 1: utwórz swoją funkcję
CREATE OR REPLACE FUNCTION add_created_at_function()
RETURNS trigger AS $BODY$
BEGIN
NEW.created_at := NOW();
RETURN NEW;
END $BODY$
LANGUAGE plpgsql;
Krok 2: utwórz wyzwalacz
CREATE TRIGGER add_created_at_trigger
BEFORE INSERT
ON company
FOR EACH ROW
EXECUTE PROCEDURE add_created_at_function();
Krok 3: przetestuj
INSERT INTO company (name) VALUES ('My company');
SELECT * FROM company;
Wyzwalacz do wielu celów
Krok 1: utwórz swoją funkcję
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;
Krok 2: utwórz wyzwalacz
CREATE TRIGGER add_log_trigger
AFTER INSERT OR UPDATE OR DELETE
ON company
FOR EACH ROW
EXECUTE PROCEDURE add_log_function();
Krok 3: przetestuj
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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow