SUMMARY: W tym artykule omówiono wyzwalacze w PostgreSQL. Opisano w nim różne typy wyzwalaczy i podano przykłady dla każdego z nich:
1. Typy trigerów
2. Tworzenie trigera
1. Triger zdarzenia INSERT
2. Wyzwalacz zdarzenia UPDATE
3. Wyzwalacz zdarzenia DELETE
4. Usuwanie wyzwalacza
5. Zastosowanie wyzwalaczy
6. Ważne punkty do zapamiętania
Definicja „wyzwalacza” określa zdarzenie, które powoduje wykonanie określonego ruchu
W PostgreSQL, jeśli chcesz wykonać określone akcje w bazie danych, takie jak INSERT, UPDATE, DELETE lub TRUNCATE, wówczas funkcjonalność wyzwalacza może okazać się przydatna, ponieważ wywołuje wymagane funkcje dla określonych zdarzeń.
Triger zostanie powiązany z określoną tabelą, widokiem lub tabelą obcą i wykona określoną funkcję podczas wykonywania określonych operacji na tabeli. W zależności od wymagań możemy tworzyć trigery PRZED, PO lub PO zdarzeniach/operacjach.
Typy trigerów
1. Triger poziomu wiersza: Jeśli triger jest oznaczony jako FOR EACH ROW, wówczas funkcja trigera będzie wywoływana dla każdego wiersza, który jest modyfikowany przez zdarzenie.
Na przykład: Jeśli UPDATE 100 wierszy w tabeli, funkcja trigera UPDATE zostanie wywołana 100 razy, raz dla każdego zaktualizowanego wiersza.
2. Statement Level Trigger: Opcja FOR EACH STATEMENT spowoduje wywołanie funkcji trigera tylko raz dla każdego wyrażenia, niezależnie od liczby modyfikowanych wierszy.
Tworzenie trigera
Polecenie SQL CREATE TRIGGER tworzy triger na określonym obiekcie.
Składnia polecenia CREATE TRIGGER jest następująca:
CREATE TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event }ON table_name ] transition_relation_name } ] { ROW | STATEMENT } ]EXECUTE { FUNCTION | PROCEDURE } function_name ( arguments ) where event can be one of: INSERTUPDATE ]DELETETRUNCATE
Bardziej szczegółowy opis oraz dostępne opcje znajdziesz w dokumentacji PostgreSQL na stronie https://www.postgresql.org/docs/12/sql-createtrigger.html.
1. Wyzwalacz zdarzenia INSERT
Wyzwalacz zdarzenia INSERT jest wywoływany podczas dodania nowego rekordu do tabeli za pomocą instrukcji INSERT.
Przykład
Przyjrzyjrzyjmy się przykładowi tworzenia nowego wyzwalacza. W tym przykładzie utworzymy nową tabelę o nazwie „Pracownik” w następujący sposób:
CREATE TABLE "Employee"("EmployeeId" INT NOT NULL,"LastName" VARCHAR(20) NOT NULL,"FirstName" VARCHAR(20) NOT NULL,"Title" VARCHAR(30),"ReportsTo" INT,"BirthDate" TIMESTAMP,"HireDate" TIMESTAMP,"Address" VARCHAR(70),"City" VARCHAR(40),"State" VARCHAR(40),"Country" VARCHAR(40),"PostalCode" VARCHAR(10),"Phone" VARCHAR(24),"Fax" VARCHAR(24),"Email" VARCHAR(60),CONSTRAINT "PK_Employee" PRIMARY KEY ("EmployeeId"));CREATE TABLE "Employee_Audit"("EmployeeId" INT NOT NULL,"LastName" VARCHAR(20) NOT NULL,"FirstName" VARCHAR(20) NOT NULL,"UserName" VARCHAR(20) NOT NULL,"EmpAdditionTime" VARCHAR(20) NOT NULL,);
Zamierzamy utworzyć triger, który będzie mógł dodać wpis do tabeli „Pracownik_Audyt” jeśli nowy rekord pracownika zostanie wstawiony do tabeli „Pracownik”.
Dodaj funkcję wyzwalacza i polecenie CREATE TRIGGER:
CREATE OR REPLACE FUNCTION employee_insert_trigger_fnc() RETURNS trigger AS$$BEGIN INSERT INTO "Employee_Audit" ( "EmployeeId", "LastName", "FirstName","UserName" ,"EmpAdditionTime") VALUES(NEW."EmployeeId",NEW."LastName",NEW."FirstName",current_user,current_date);RETURN NEW;END;$$LANGUAGE 'plpgsql';CREATE TRIGGER employee_insert_trigger AFTER INSERT ON "Employee" FOR EACH ROW EXECUTE PROCEDURE employee_insert_trigger_fnc();
Po utworzeniu powyższego wyzwalacza INSERT w tabeli, doda on jeden nowy wpis do tabeli „Employee_Audit” z tymi szczegółami:
trigger_demo=# INSERT INTO "Employee" VALUES(10,' Adams','Andrew','Manager',1,'1962-02-18 00:00:00','2010-08-14 00:00:00','11120 Jasper Ave NW','Edmonton','AB','Canada','T5K 2N1','+1 780 428-9482','+1 780 428-3457','[email protected]');INSERT 0 1trigger_demo=# select * from "Employee" where "EmployeeId" =10;--------------------EmployeeId | 10LastName | AdamsFirstName | AndrewTitle | ManagerReportsTo | 1BirthDate | 1962-02-18 00:00:00HireDate | 2010-08-14 00:00:00Address | 11120 Jasper Ave NWCity | EdmontonState | ABCountry | CanadaPostalCode | T5K 2N1Phone | +1 780 428-9482Fax | +1 780 428-3457Email | [email protected]_demo=#trigger_demo=# select * from "Employee_Audit" ;----+-----------EmployeeId | 10LastName | AdamsFirstName | AndrewUserName | postgresEmpAdditionTime | 2019-11-10
2. Wyzwalacz zdarzenia UPDATE
Wyzwalacz zdarzenia UPDATE jest wywoływany w momencie wykonania polecenia UPDATE.
Przykład
CREATE TRIGGER verify_user_for_update BEFORE UPDATE ON "Employee" FOR EACH ROWEXECUTE PROCEDURE employee_verify_user_priv();
3. Triger zdarzenia DELETE
Ten triger zdarzenia DELETE może zostać dodany do transakcji usuwających rekordy.
Przykład
CREATE TRIGGER employee_delete_trigger AFTER DELETE ON "Employee" FOR EACH ROW EXECUTE PROCEDURE aft_delete();
Usuwanie trigera
DROP TRIGGER służy do usuwania trigera. Składnia jest bardzo prosta.
drop trigger employee_insert_trigger on "Employee" ;
Usługi wyzwalaczy
1. Audyt: Możesz użyć wyzwalaczy do śledzenia transakcji w tabeli poprzez rejestrowanie szczegółów zdarzeń.
2. Wymuszanie sprawdzania ograniczeń: Możesz utworzyć wyzwalacz, dzięki któremu sprawdzisz ograniczenia przed zastosowaniem transakcji do tabeli.
3. Automatyczna populacja: Używając trigerów możesz również automatycznie wypełniać pola tabel przez nowe transakcje manipulacji rekordami.
Ważne punkty do zapamiętania
1. Aby utworzyć triger na tabeli, użytkownik musi posiadać uprawnienie TRIGGER na tabeli oraz uprawnienie EXECUTE na funkcji trigera.
2. Możesz sprawdzić katalog systemowy „pg_trigger” aby uzyskać informacje o istniejących trigerach w bazie danych.
3. Jeśli utworzysz wiele trigerów na tym samym obiekcie dla tego samego zdarzenia, będą one uruchamiane w kolejności alfabetycznej według nazwy.
4.