Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Felügyelt Azure SQL-példány
SQL-adatbázis a Microsoft Fabricben
A DML-eseményindító egy speciális típusú tárolt eljárás, amely automatikusan érvénybe lép az eseményindítóban definiált táblát vagy nézetet érintő adatmanipulációs nyelv (DML) esemény bekövetkezésekor. A DML-események közé tartoznak a INSERT, UPDATE vagy DELETE utasítások. A DML-eseményindítók üzleti szabályok és adatintegritás kényszerítésére, más táblák lekérdezésére és összetett Transact-SQL utasításokra használhatók. Az eseményindító és az azt kiváltó utasítás egyetlen tranzakcióként lesz kezelve, amely az eseményindítón belülről visszaállítható. Ha súlyos hibát észlel (például nincs elegendő lemezterület), a teljes tranzakció automatikusan visszagördül.
Előnyök
A DML-eseményindítók hasonlóak a korlátozásokhoz, mivel az entitásintegritást vagy a tartományintegritást kényszeríthetik ki. Az entitásintegritást általában mindig a legalacsonyabb szinten kell kikényszeríteni olyan indexekkel, amelyek a korlátozások részét képezik PRIMARY KEY , UNIQUE vagy amelyek a korlátozásoktól függetlenül jönnek létre. A tartományintegritást kényszerekkel kell kikényszeríteni CHECK , a hivatkozási integritást (RI) pedig kényszerekkel kell kikényszeríteni FOREIGN KEY . A DML-eseményindítók akkor hasznosak, ha a korlátozások által támogatott funkciók nem képesek kielégíteni az alkalmazás funkcionális igényeit.
Az alábbi lista összehasonlítja a DML-eseményindítókat a kényszerekkel, és azonosítja, hogy a DML-eseményindítók mikor rendelkeznek előnyökkel a kényszerekkel szemben.
A DML-eseményindítók kaszkádolt változásokat hozhatnak az adatbázis kapcsolódó tábláiban; ezek a módosítások azonban hatékonyabban végrehajthatók kaszkádolt hivatkozási integritási korlátozások használatával.
FOREIGN KEYkényszerek csak akkor érvényesíthetik egy oszlop értékét, ha az pontosan megegyezik egy másik oszlopban lévő értékkel, kivéve, ha aREFERENCESzáradék egy kaszkádoló hivatkozási műveletet határoz meg.Védelmet nyújthatnak a rosszindulatú vagy helytelen
INSERT,UPDATEésDELETEműveletek ellen, és kényszeríthetik azokat az egyéb korlátozásokat, amelyek összetettebbek, mint aCHECKkorlátozások által meghatározottak.A korlátozásoktól eltérően
CHECKa DML-eseményindítók hivatkozhatnak más táblák oszlopaira. Az eseményindítók például használhatnak egySELECTmásik táblából származó adatokat a beszúrt vagy frissített adatok összehasonlítására, valamint egyéb műveletek végrehajtására, például az adatok módosítására vagy egy felhasználó által megadott hibaüzenet megjelenítésére.Kiértékelhetik egy tábla állapotát egy adatmódosítás előtt és után, és a különbség alapján műveleteket hajthatnak végre.
A táblán található azonos típusú (
INSERTUPDATEvagyDELETE) több DML-eseményindító lehetővé teszi, hogy ugyanazon módosítási utasításra válaszul több különböző művelet is végbe legyen hajtva.A korlátozások csak szabványosított rendszerhiba-üzeneteken keresztül tudnak kommunikálni a hibákról. Ha az alkalmazás testre szabott üzeneteket és összetettebb hibakezelést igényel vagy használhat, eseményindítót kell használnia.
A DML-eseményindítók letilthatják vagy visszaállíthatják a hivatkozási integritást sértő módosításokat, így megszakíthatják a megkísérelt adatmódosítást. Egy ilyen eseményindító akkor lép érvénybe, amikor módosít egy idegen kulcsot, és az új érték nem egyezik meg az elsődleges kulccsal. A
FOREIGN KEYkorlátozásokat azonban általában erre a célra használják.Ha a triggertáblán korlátozások vannak, akkor a rendszer a
INSTEAD OFtrigger végrehajtása után, de aAFTERtrigger végrehajtása előtt ellenőrzi őket. Ha a korlátozások sérülnek, a rendszer visszaállítja aINSTEAD OFtriggerműveleteket, és nem hajtja végre azAFTEReseményindítót.
A DML-eseményindító típusai
AFTER eseményindító
AFTER eseményindítók végrehajtása az INSERT, UPDATE, MERGE vagy DELETE utasítás műveletének végrehajtása után történik.
AFTER a rendszer soha nem hajtja végre az eseményindítókat, ha kényszermegsértés történik. Ezért ezek az eseményindítók nem használhatók olyan feldolgozáshoz, amely megakadályozhatja a kényszerek megsértését. Az utasításban INSERT megadott minden UPDATE, DELETE vagy MERGE művelet esetében a rendszer minden DML-művelethez aktiválja a megfelelő triggert.
TRIGGER HELYETT
INSTEAD OF eseményindítók felülbírálják az eseményindító utasítás szokásos műveleteit. Így hiba- vagy értékellenőrzést végezhetnek egy vagy több oszlopon, és egyéb műveleteket hajthatnak végre a sorok vagy sorok beszúrása, frissítése vagy törlése előtt. Ha például egy bértábla egy órabér oszlopában frissülő érték meghaladja a megadott értéket, egy eseményindító megadható egy hibaüzenet létrehozásához és a tranzakció visszagördítéséhez, vagy új rekord beszúrása egy naplóbe, mielőtt a rekordot beszúrja a bérszámfejtési táblába. Az eseményindítók elsődleges előnye INSTEAD OF , hogy olyan nézeteket engedélyeznek, amelyek nem támogatják a frissítéseket. Egy több alaptáblán alapuló nézetnek például egy INSTEAD OF eseményindítóval kell támogatnia azokat a beszúrásokat, frissítéseket és törléseket, amelyek egynél több táblában lévő adatokra hivatkoznak. Az eseményindítók másik előnye INSTEAD OF , hogy lehetővé teszik olyan logika kódolását, amely elutasíthatja a köteg egyes részeit, miközben lehetővé teszi a köteg más részeinek sikerességét.
Ez a táblázat a AFTER és INSTEAD OF triggerek funkcionalitását hasonlítja össze.
| Funkció |
AFTER eseményindító |
INSTEAD OF eseményindító |
|---|---|---|
| Alkalmazhatóság | Táblázatok | Táblák és nézetek |
| Mennyiség táblánként vagy nézetenként | Eseményindító műveletenként több (UPDATE, DELETE, és INSERT) |
Eseményindító műveletenként egy (UPDATEés DELETEINSERT) |
| Kaszkádolt hivatkozások | Nincsenek korlátozások |
INSTEAD OF UPDATE és DELETE az eseményindítók nem engedélyezettek olyan táblákon, amelyek kaszkádolt hivatkozási integritási korlátozások célpontjai. |
| Kivégzés | Utána: Kényszerfeldolgozás Deklaratív hivatkozási műveletek inserted és deleted táblák létrehozásaAz eseményindító művelet |
Előtte: Kényszerfeldolgozás A következő helyett: Az eseményindító művelet Utána: inserted és deleted táblák létrehozása |
| Végrehajtási sorrend | Lehet, hogy az első és az utolsó végrehajtás meg van adva | Nem alkalmazható |
varchar(max), nvarchar(max), és varbinary(max) oszlophivatkozások a inserted és deleted táblákban |
Engedélyezett | Engedélyezett |
szöveg, ntext és kép oszlophivatkozások a inserted és deleted táblázatokban |
Nem megengedett | Engedélyezett |
CLR-eseményindító
A közös nyelvi futtatókörnyezet (CLR) eseményindítója lehet AFTER vagy INSTEAD OF eseményindító. A CLR-eseményindítók adatdefiníciós nyelv (DDL) eseményindítók is lehetnek. A CLR-eseményindítók ahelyett, hogy egy Transact-SQL tárolt eljárást hajtanak végre, egy vagy több felügyelt kódban írt metódust hajtanak végre, amelyek a .NET-keretrendszerben létrehozott és az SQL Serverbe feltöltött szerelvény tagjai.
Kapcsolódó tevékenységek
| Feladatok | Cikk |
|---|---|
| A DML-eseményindítók létrehozásának módját ismerteti. | DML-eseményindítók létrehozása |
| A CLR-trigger létrehozásának módját ismerteti. | CLR-eseményindítók létrehozása |
| Ismerteti, hogyan hozhat létre DML-eseményindítót az egysoros és a többsoros adatmódosítások kezeléséhez. | DML-eseményindítók létrehozása több adatsor kezeléséhez |
| Az eseményindítók beágyazási módját ismerteti. | Beágyazott eseményindítók létrehozása |
Ismerteti, hogyan adhatja meg az eseményindítók indításának sorrendjét AFTER . |
Első és utolsó eseményindítók megadása |
| A speciális beszúrt és törölt táblák használatát ismerteti az eseményindító kódban. | A beszúrt és törölt táblák használata |
| A DML-eseményindítók módosításának vagy átnevezésének módját ismerteti. | DML-eseményindítók módosítása vagy átnevezése |
| Ismerteti, hogyan tekintheti meg a DML-eseményindítókkal kapcsolatos információkat. | Információk szerzése a DML-eseményindítókról |
| A DML-eseményindítók törlésének vagy letiltásának módját ismerteti. | DML-eseményindítók törlése vagy letiltása |
| Az eseményindítók biztonságának kezelését ismerteti. | Eseményindító biztonságának kezelése |