Postgres pro standard dokumentáció 9

42.9. Trigger eljárások

A PL / pgSQL ravaszt, akkor létrehozhat eljárásokat fognak nevezni, amikor az adatok megváltoztatása vagy esemény az adatbázisban. A trigger eljárás által létrehozott CREATE FUNCTION parancsot. ebben az esetben a funkciót nem lehet érveket, és a visszatérő típusúnak kell lennie ravaszt (az váltja ki, hogy a tűz, ha az adatok változások) vagy event_trigger (trigger, amikor az események az adatbázisban). Ahhoz, hogy automatikusan elindítja meghatározott speciális lokális változók olyan nevekkel, mint PG_ változó. azokat a feltételeket, amelynek eredményeként a hívás ravaszt.







42.9.1. Az adatok megváltoztatásakor aktiválódik

Induljanak, amikor az adatok nyilvánították funkció nem érveket és az eredmény típusa ravaszt. Megjegyzendő, hogy ezt a funkciót kell nyilvánítani paraméterek nélkül is, ha azt várjuk, hogy meg fogja kapni érvek a parancsban megadott CREATE TRIGGER - ilyen érvek átengedjük TG_ARGV. az alábbiakban leírtak szerint.

Amikor egy PL / pgSQL függvény egy triggerként aktiválódik, több speciális változó kerül automatikusan létrehozásra a felső szintű blokkban:

Az adattípus a RECORD. A változó új sorokat tartalmaz a sorszintű triggerek INSERT / UPDATE parancsára. Az ügyintéző-triggerekben és a változó DELETE utasításában az érték nincs hozzárendelve. RÉGI

Az adattípus a RECORD. A változó a régi szintű adatbázis-sorokat tartalmazza a sorszintű triggerek UPDATE / DELETE parancsára. Az operátorszintű triggerekben és a változó INSERT parancsánál az érték nincs hozzárendelve. TG_NAME

Az adattípus neve. A változó tartalmazza a kiváltott trigger nevét. TG_WHEN

Az adattípus szöveg. ELŐTT tartalmazó karaktersorozat. KÉRDEZZE vagy HELYE. a triggertől függően. TG_LEVEL

Az adattípus szöveg. ROW vagy STATEMENT szöveggel rendelkező karakterlánc. a triggertől függően. TG_OP

Az adattípus szöveg. INSERT-t tartalmazó karakterlánc. UPDATE. TÖRLÉS vagy TRUNCATE. attól függően, hogy milyen műveletet indított a trigger. TG_RELID

Az adattípus az oid. A tábla OID-je, amelyre az indító aktiválódott. TG_RELNAME

Az adattípus neve. Az a tábla neve, amelyre a trigger aktiválódott. Ez a változó elavult és a későbbi kiadásokban nem érhető el. Ehelyett a TG_TABLE_NAME alkalmazást kell használnia. TG_TABLE_NAME

Az adattípus neve. Az a tábla neve, amelyre a trigger aktiválódott. TG_TABLE_SCHEMA

Az adattípus neve. A táblát tartalmazó séma neve, amelyre a trigger aktiválódott. TG_NARGS

Az adattípus egész szám. A CREATE TRIGGER parancs argumentumainak száma. amelyeket trigger-eljárásban továbbítanak. TG_ARGV []

Az adattípus szöveg tömb. Argumentumok a CREATE TRIGGER utasításból. A tömb indexe 0-val kezdődik. Az érvénytelen indexértékek ( <0 или>= tg_nargs) visszaadja a NULL értéket.

A trigger funkciónak vissza kell állnia NULL-nak. vagy egy olyan rekord / karakterlánc, amely megfelel annak a táblázatnak a szerkezetéhez, amelyhez a trigger aktiválódott.

Ha a BEFORE trigger vonalszintű NULL. akkor minden további intézkedéseket megállítani ezt a vonalat (azaz. e. nem működik a következő kiváltó, INSERT / UPDATE / DELETE parancs erre sor nem kerül sor). Ha nem NULL. A további feldolgozás folytatódik ezen a vonalon. A visszatérő vonal eltér a kezdeti ÚJ. módosítsa a karakterláncot kell beilleszteni, vagy megváltozott. Ezért, ha a trigger funkció kell végezni néhány intézkedés, és nem változik a húr is, hogy vissza kell térni a változó új (vagy azzal egyenértékű). Megváltoztatni által tárolt tétel, meg lehet változtatni az egyes értékeket a változó ÚJ, majd vissza. Vagy hozzon létre, és visszatér egy teljesen új változót. Abban az esetben, a vonal előtt kiváltó DELETE parancs visszatérési értéke maga nincs közvetlen hatása, de ez legyen eltér NULL. hogy ne szakítsa meg a feldolgozó vonal. Megjegyezzük, hogy a változó NEW mindig NULL triggerekben a DELETE. így vissza nincs értelme. Hagyományos idiómává törlése Vezérlőjelek visszatérés változó OLD.







HELYETT kiváltó vissza lehet NULL (mindig kiváltja sor-szintű, és ezek csak ötletek is használható), megmutatni, hogy nem végez semmilyen változás, hogy a feldolgozás a sor nem tudja folytatni (azaz nem okoz későbbi kiváltó okok nem tekinthetők sor között feldolgozott sorok mások INSERT / UPDATE / DELETE parancsok). Ellenkező esetben vissza eltérő értékre NULL, jelezve, hogy a kért művelet ravaszt. INSERT és UPDATE műveletek a visszatérési érték legyen új. amely trigger funkció lehet módosítani, hogy támogassák INSERT VISSZAHELYEZÉSE javaslatok és UPDATE VISSZAHELYEZÉSE (ez is hatással lesz az értéke a húr továbbított későbbi kiváltó, vagy rendelkezésre álló speciális alias KIZÁRT INSERT utasítás egy tulajdonság a konfliktus-DO UPDATE). DELETE műveletek a visszatérési érték kell, hogy legyen a régi.

Az AFTER vonalindító visszatérési értéke és a kezelői szintű triggerek (BEFORE vagy AFTER) mindig figyelmen kívül maradnak. Ez lehet NULL. Azonban ezeknél a triggereknél még mindig megszakíthatja a parancsot, ami miatt őket okozták, ezért ezt kifejezetten hibát kell okoznia.

A 42.3. Példa PL / pgSQL-ben lévő kiváltó eljárás példáját mutatja.

42.3. Példa. Lövő eljárás PL / pgSQL

A trigger biztosítja, hogy amikor egy rekordot adnak hozzá vagy módosítanak egy táblázatban, ez a bejegyzés az aktuális felhasználóról és az időbélyegről információt tárol. Azt is figyelemmel kíséri, hogy a munkavállaló nevét jelölik és a fizetés nulla fölött van.

A táblázat módosítási naplójának másik módja az, hogy hozzon létre egy új táblát, amely külön bejegyzést tartalmaz minden végrehajtott INSERT, UPDATE, DELETE parancs végrehajtásához. Ez a megközelítés az auditálás naplózási változásainak tekinthető a táblázatban. A 42.4. Példa bemutatja a PL / pgSQL megfelelő trigger eljárását.

42.4. Példa. Engedélyezési eljárás PL / pgSQL auditáláshoz

A trigger biztosítja, hogy az emp tábla sorainak beillesztésére, módosítására vagy törlésére szolgáló parancsokat az emp_audit táblában ellenőrizzék. A műveletet végrehajtó felhasználó, az időbélyegző és a művelet típusát is feljegyzi.

Az előző példában olyan verzió van, amely egy nézetet használ, amely összeköti a fő táblát és az auditálási táblázatot, hogy megjelenítse az egyes sorok utolsó módosításának dátumát. Ez a megközelítés továbbra is egy külön táblázatban teljes ellenőrzési nyomvonalat tart fenn, de egy egyszerűsített ellenőrzési nyomvonal is van. Ez a nézet tartalmaz egy időbélyeget, amelyet az auditálási táblázat minden egyes sorára kiszámítanak. A 42.5 példa egy PL / pgSQL auditálás bemutatójának kiváltó okát mutatja.

42.5. Példa. Trigger megjelenítéssel a PL / pgSQL auditálásához

Trigger egy ötlet használják, hogy ez az ötlet a változó és biztosítják, hogy minden parancsot beszúrni, módosítása vagy törlése sorok a bemutató lesz rögzítve audit emp_audit asztalra. Is ír egy időbélyeg, a felhasználói nevet és típusát az elvégzendő művelet. Nézetben a legutóbbi módosítás dátuma soronként.

Az aktiválók egyikének az a lehetősége, hogy a külön táblázatot naprakészen tartsa egy adott táblázat számára. Bizonyos esetekben külön lekérdezõ táblázatot lehet használni a lekérdezésekben a fõ táblázat helyett. Ebben az esetben gyakran a kérelmek végrehajtásának ideje jelentősen csökken. Ezt a technikát széles körben használják az adattárházakban, ahol a ténytáblák nagyon nagyok lehetnek. A 42.6. Példa a PL / pgSQL triggerelési eljárását mutatja. amely támogatja az adattárház ténytáblájának összefoglaló tábláját.

42.6. Példa. A PL / pgSQL-ben lévő triggerező eljárás az összesített táblázat támogatásához

42.9.2. Esemény triggerek

PL / pgSQL-ben létrehozhat eseményindítót. A Postgres Pro megköveteli, hogy egy eseményindítónak nevezett eljárást argumentumok nélkül deklaráljanak, és a visszatérési érték típusa event_trigger.

Amikor egy PL / pgSQL függvényt aktiválnak eseményként, több speciális változót hoznak létre automatikusan a felső szintű blokkban:

Az adattípus szöveg. Olyan karakterlánc, amely az eseményt kiváltotta. TG_TAG

Az adattípus szöveg. Egy változó, amely tartalmazza a parancs címkéjét, amelyre az indító aktiválódott.

A 42.7. Példa PL / pgSQL-ben egy esemény-triggerelési eljárás példáját mutatja.

42.7. Esemény trigger eljárást PL / pgSQL-ben

Ez a flip-flop példa egyszerűen kiad egy NOTICE üzenetet minden egyes támogatott parancs végrehajtásakor.