YHTEENVETO: Tässä artikkelissa käsiteltiin PostgreSQL:n triggereitä. Siinä kuvataan erityyppiset triggerit ja annetaan esimerkkejä jokaisesta:
1. Triggereiden tyypit
2. Triggerin luominen
1. INSERT-tapahtuman trigger
2. INSERT-tapahtuman trigger
. UPDATE-tapahtumalaukaisin
3. DELETE-tapahtumalaukaisin
4. Laukaisimen poistaminen
5. Triggereiden käyttötarkoitukset
6. Tärkeää muistettavaa
Triggeriksi määritellään mikä tahansa tapahtuma, joka asettaa liikkeelle jonkin toiminnon.
PostgreSQL:ssä, jos haluat ryhtyä toimenpiteisiin tietyissä tietokantatapahtumissa, kuten INSERT-, UPDATE-, DELETE-, DELETE- tai TRUNCATE-tapahtumissa, triggeritoiminnallisuus voi olla hyödyllinen, koska se kutsuu vaaditun toiminnon määritellyissä tapahtumissa.
Triggeri liitetään määritettyyn tauluun, näkymään tai vieraaseen tauluun ja se suorittaa määritetyn toiminnon, kun tietyt toiminnot suoritetaan kyseisessä taulussa. Vaatimuksesta riippuen voimme luoda laukaisimen ENNEN, JÄLKEEN tai VÄLILLÄ tapahtumaa/operaatiota.
Tyyppisiä laukaisimia
1. Rivitason laukaisin:
Esim: Jos päivitämme 100 riviä taulukkoon, UPDATE-toimintoa kutsutaan 100 kertaa, kerran kutakin päivitettyä riviä kohden.
2. Statement Level Trigger: FOR EACH STATEMENT -vaihtoehto kutsuu liipaisinfunktiota vain kerran kutakin lausetta kohden riippumatta siitä, kuinka monta riviä muutetaan.
Liipaisimen luominen
SQL-komento CREATE TRIGGER luo liipaisimen määritettyyn kohteeseen.
CREATE TRIGGERin syntaksi on seuraava:
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
Tarkemman kuvauksen ja käytettävissä olevat vaihtoehdot löydät PostgreSQL:n dokumentaatiosta osoitteesta https://www.postgresql.org/docs/12/sql-createtrigger.html.
1. INSERT-tapahtumatriggeri
INSERT-tapahtumatriggeriä kutsutaan, kun tauluun lisätään uusi tietue INSERT-lauseella.
Esimerkki
Katsotaanpa esimerkki uuden triggerin luomisesta. Tässä esimerkissä luodaan uusi taulukko nimeltä ”Työntekijä” seuraavasti:
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,);
Luomme laukaisimen, joka voi lisätä merkinnän taulukkoon ”Työntekijä_Audit”, jos uusi työntekijätietue lisätään taulukkoon ”Työntekijä”. Kirjaamme käyttäjätunnuksen tiedot, jotka lisäävät tietueen ”Employee”-taulukkoon.
Lisäämme trigger-funktion ja CREATE TRIGGER-komennon:
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();
Kun luomme taulukkoon edellä mainitun INSERT-triggerin, se lisää yhden uuden tietueen ”Employee_Audit”-taulukkoon seuraavilla tiedoilla:
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. UPDATE-tapahtumatriggeri
UPDATE-tapahtumatriggeriä kutsutaan UPDATE-lauseen suorittamisen yhteydessä.
Esimerkki
CREATE TRIGGER verify_user_for_update BEFORE UPDATE ON "Employee" FOR EACH ROWEXECUTE PROCEDURE employee_verify_user_priv();
3. DELETE-tapahtumalaukaisin
Tämä on DELETE-tapahtumalaukaisin, joka voidaan lisätä tapahtumiin, jotka poistavat tietueita.
Esimerkki
CREATE TRIGGER employee_delete_trigger AFTER DELETE ON "Employee" FOR EACH ROW EXECUTE PROCEDURE aft_delete();
Liipaisimen poistaminen
DROP TRIGGERiä käytetään liipaisimen poistamiseen. Syntaksi on hyvin yksinkertainen.
drop trigger employee_insert_trigger on "Employee" ;
Triggereiden käyttötarkoitukset
1. Tilintarkastus: Voit käyttää laukaisimia taulukkotapahtumien seuraamiseen kirjaamalla tapahtuman yksityiskohdat.
2. Tarkastusrajoituksen pakottaminen: Voit luoda laukaisimen, jolla voit tarkistaa rajoitukset ennen tapahtuman soveltamista taulukkoon.
3. Automaattinen populaatio: Käyttämällä laukaisimia voit myös täyttää taulukon kentät automaattisesti uusien tapahtumien tietueiden manipuloinnilla.
Tärkeitä muistettavia asioita
1. Jos haluat luoda laukaisimen taulukkoon, käyttäjällä on oltava TRIGGER-oikeus taulukkoon ja EXECUTE-oikeus laukaisutoimintoon.
2. Voit tarkistaa järjestelmäluettelosta ”pg_trigger” tietokannassa olemassa olevat laukaisutiedot.
3. Jos luot useita laukaisimia samaan objektiin samalle tapahtumalle, nämä laukaisimet laukeavat aakkosjärjestyksessä nimensä mukaan.
4. Jos luot useita laukaisimia samaan kohteeseen samaa tapahtumaa varten, nämä laukaisimet laukeavat nimen mukaan.