kiváltja programozás

Miután ezt a leckét, akkor:

létrehozni kiváltó, hogy hajtsák végre az üzleti logikát az adatbázisba;

pszeudo beszúrva és hagyni

Használja a rendszer normál funkcióinak ravaszt.

Becsült órakeretük - kb 40 perc.

Amikor égetés kiváltó események INSERT, UPDATE vagy DELETE létrehoz egy ál egy vagy több (más néven logikai táblázatot). Mi lehet vizsgálni az asztalra, mint egy logikai tranzakciót naplózza az eseményeket. Kétféle logikai táblázatok: A beillesztett és törölt. Beillesztésre eredményeképpen létrejött a hozzáadás vagy frissítés eseményeket. Ez egy sor rekordok hozzáadott vagy módosított.

UPDATE trigger létrehoz egy logikai táblázat törölve. Ez a kezdeti rekordok ugyanabban az állapotban, amelyben volt, mielőtt a frissítési műveletet. A következő példa létrehoz egy ravaszt, amely megjeleníti a tartalmát, és törölve egészítik ki UPDATE szerzők esemény a táblázatban:

CREATE TRIGGER dbo.updatetables

SELECT „Leírás” = a behelyezett táblázat: '

SELECT * FROM ki

SELECT „Leírás” = „A Táblázat törölve:”

SELECT * FROM törölve

A beillesztett táblázat:

Egyenes Denby Oakland CA 94009

A törölt tábla:

Egyenes Dean Oakland CA 94B09

Végrehajtása után a ravaszt frissítés Szerzők asztal (ravaszt táblázat) biztosítja egy frissítést rekordot. Ha bekapcsol, a ravaszt visszaállíthatja a módosításokat a szerzők asztalra. ha megfelelő intézkedések vannak programozva a ravaszt. Visszaállíthatja a tranzakció is előírja az INSERT és DELETE ravaszt.

Ha bekapcsol, a ravaszt, hogy távolítsa el egy sor törölt rekordok helyeztük logikai táblázat törölve. A beillesztett táblázat nem vesz részt az eseményen DELETE.

Megjegyzés: Az előző példában a SELECT utasítás csak szemléltetés céljából. Soha ne használjunk kiváltó szereplők, hogy visszatérjen egy eredmény, ha nem biztos benne, hogy mi az eredmény lesz az alkalmazás által feldolgozott, ami miatt a ravaszt a tüzet.

Most, hogy megtanultuk a célból, flip-flop, és találkozott a különböző típusú, leírjuk a szintaxis nyilatkozatok létrehozására és módosítására ravaszt. Funkciók és a rendszer parancsokat kiterjeszteni a kiváltó engedélyezheti, hogy leírja az üzleti logika bennük.

Konstrukciók UPDATE (oszlopnév) és (COLUMNS_UPDATED ())

Az alsó szerkezet - UPDATE (imya_spgolbtsa) és (COLUMNS_UPDATED ()) - fontos komponensei üzemeltetők CREATE TRIGGER és ALTER ravaszt. Ezeket a konstrukciókat hagyjuk tartalmaznia Update és INSERT-kiváltó, és lehet bárhol a CREATE TRIGGER utasítást vagy ALTER ravaszt.

Tervezés IF UPDATE (oszlopnév) meghatározza, hogy a COLUMN_NAME INSERT vagy UPDATE esemény. Ha azt szeretnénk, hogy egynél több oszlopot, akkor meg kell osztania a formatervezési UPDATE (oszlop_neve). Például, a következő kód-fragmens ellenőrzi, hogy kívül, vagy frissítés végzett oszlopok és LAST_NAME FIRST_NAME. és végrehajtja néhány fellépés a következő oszlopokat események eredményeként INSERT vagy UPDATE:

IF UPDATE (FIRST_NAME) OR UPDATE (LAST_NAME)

-- Ha bármelyik oszlop frissül.

-- fut rajta semmilyen intézkedést.

Halasztott névfeloldás lehetővé hiányában az oszlop táblázat első oszlopában megadott név a paramétert. idején kötődését kiváltó asztalra. Azonban szükséges, hogy ez az oszlop idején léteztek a ravaszt. További információ a halasztott névfeloldás leírt tlave 8.

Ha helyettesíti az érték helyett az oszlop nevét. UPDATE kikötés igazat fog visszaadni. Tervezés (COLUMNS_UPDATED ()) is ellenőrzi, hogy az oszlop frissítve. Ehelyett igaz vagy hamis szerkezet (COLUMNS_UPDATED ()) visszaad egy varbinary bit típusú maszk. írja le az oszlopok, amelyben a felül vagy frissítés végre.

Írja tervezés (COLUMNS_UPDATED ()) nehezebb, mint UPDATE (oszlop_neve), de lehetővé teszi, hogy pontosan meghatározni, mely a vizsgált oszlopok hozzáadott vagy frissített adatokat. Ellenőrizhető oszlopok van beállítva egy maszkot, amely képviseli a számát (szekvencia) Az egyes oszlopok a táblázatban. Egy későbbi táblázat első nyolc oszlopok és a hozzájuk rendelt maszk.

A következő kód lehetővé teszi annak ellenőrzését, hogy az adatok már hozzá vagy frissítse oszlopában a 4. és 6.

IF (COIUMNS_ U PDATEDO 40)> 0

Érték 40 - az eredménye összegezve a maszk 8 a 4. oszlopban, és a maszkot 32 6. oszlop Expression ellenőrzi, hogy az érték (COLUMNS_UPDATED ()) nagyobb, mint 0. Más szavakkal, a feltétel akkor teljesül, ha legalább az egyik vagy mindkét oszlop frissülnek. Ha megadja a feltétel (COLUMNS_UPDATED () 40) = 40, a frissítés ellenőrzést végzünk mindkét oszlopban. Ha a frissítés történt csak az egyik oszlop, a feltételek nem teljesülnek.

A teszt a kilenc vagy több oszlopot, használja azt a rész funkciót, amely lehetővé teszi, hogy meghatározza a ravaszt maszkot kell ellenőrizni. Például az alábbi kódot annak ellenőrzésére, hogy a kilencedik oszlop frissítve:

IF ((substring (COLUMNS_UPDATED (), 2,1) = 1))

Substring függvény hatására a szerkezet (COLUMNS_UPDATED ()> megy a második oktett az oszlop és ellenőrizze, hogy az első oszlop a második oktett (a tényleges sorszám 9) frissítve lett. Az ebben az oszlopban értéket ad vissza típusú varbinary. Egyenlő 1. A táblázatokban alább látható? Illusztrálja azt az elvet substring funkció intézkedések ellenőrzéséhez szükséges oszlopokat 9-től 16.

IF ((substring (COLUMNS_UPDATED (), 2, y) = Z))

Ahhoz, hogy nézd meg néhány oszlopok módosítása a cél, egyszerűen összeadja az bitmaszkként mindegyikre. Például, hogy ellenőrizze oszlopok 14 és 16, be kell állítani az expressziós z 160 (128 + 32).

Funkciók és a rendszer parancsokat

Ahhoz, hogy az üzleti logika megvalósításához a kiváltó okok a különböző funkciók és a rendszer parancsokat. A trigger gyakran használt funkciót @@ ROWCOUNT. Ez visszaadja a sorok számát, amelyeket érint a végrehajtása az előző üzemeltető-SQL. INSERT ravaszt tüzek esetén, UPDATE vagy DELETE, akkor is, ha nem változik egy sort. Ezért, a kimenete a flip-flop hiányában módosítása a táblázat a rendszer visszatérő parancsot.

Ha hiba van szükség ahhoz, megjelenik egy üzenet, amely leírja annak okait. Hibaüzenetek megjelenítésére a rendszert használó parancs RAISERROR. Egyéni hibaüzenetek létre a rendszer tárolt eljárás sp_addmessage vagy kimeneti üzenetek beágyazott hívórendszert RAISERROR parancsot. További információ a rendszer tárolt eljárás sp_addmessage kapcsolati az SQL Server Books Online. A kiváltó írt-SQL nyelv, néha használt rendszer parancs ROLLBACK tranzakciót. Ez okozza visszaállítását a ravaszt csomagot. Amikor egy végzetes hiba van egy rollback, de hallgatólagosan. Ha az a cél, hogy beindítsák a befejezése a tranzakció. egyébként (kivéve, ha az ügylet során fellépő végzetes hiba), a ravaszt kód nem tartalmazza a rendszer parancsot ROLLBACK tranzakciót.

Óvintézkedések a használatát-SQL

A trigger kód SELECT utasítások és nyomtat, és értékeket rendelhet változókat. Azonban ezeknek a használata szereplők, hogy visszatérjen eredmény határozza meg, csendes és biztonságos értékeket. Általában a ravaszt átlátható a felhasználó vagy alkalmazás. De ha az alkalmazás nem programozott kezelni visszatérési értékek, például az eredmény meg a SELECT, a működési hiba fordulhat elő a kérelmet. Ugyanakkor a használata a SELECT, mint a szolgáltató érték meglehetősen elfogadható egy állapotfelméréssel az üzemeltető. Például, akkor a SELECT ellenőrizni, hogy létezik egy bizonyos értéket, és visszatér, hogy érték az üzemeltető ha létezik további feldolgozásra. Értékeket rendelni a változók szerepelnek azok FTC stb ogrammy ravaszt SET parancs nocount ON.

A flip-flop nem engedélyezett követi-SQL nyilatkozatai:

  • ALTER, CREATE, DROP, helyreállítása és LOAD DATABASE;
  • LOAD és visszaállítás LOG;
  • DISK RESIZE és DISK INIT;
  • Újrakonfigurálás.

Triggerek lehetővé teszi, hogy végre minden olyan intézkedés az asztalra vagy a nézet helyett (és nem-triggerek) vagy után (AFTER-kiváltó) végrehajtása INSERT, UPDATE vagy DELETE. Triggerek teszi, hogy megoldja a különböző problémákat.

§ kiszámítása az időközi eredmények és egyéb kiszámított értékeket. Az adatbázist folyamatosan változik, ahogy hozzá, törölheti és módosíthatja az adatokat a táblázatokban. Bizonyos esetekben a „oszlopban lévő adatokat egy táblázatban lehet számítani alapján a módosított adatokat egy másik táblázatban. Triggerek olyan ideális eszköze végrehajtási számított oszlopok. Ábra. 9-3 ábra a ravaszt, hogy használják, hogy frissítse a kiskereskedelmi ára áruk Inventory tábla változása az átlagos nagykereskedelmi ár Beszerzési egy asztalra.

Következő trigger csatolt beszerzési asztalra. Kiszámítja az átlagos optopuyu ár az áru egy raktárban, növeli azt a 30% -ot, és frissíti az értéket retail_price oszlop a táblázatban Inventory:

CREATE TRIGGER Retail_Price_Update

UTÁN INSERT, UPDATE, DELETE AS

Ha létezik (SELECT item_num SZÁRMAZÓ behelyezve)

(SELECT (SUM (pur.total_cost) / SUM (pur.qty_ordered) * 1,30)

Beszerzési pur inner join Inserted ins

PUR. item_num = inek. item_num)

A leltár inv beillesztett ins

HOL inv. item_num - inek. it'3m_num

ELSE ha létezik (SELECT item_ium törölt)

(SELECT (SUM (pur.total_cost) / SUM (pur.qty_ordered)

Beszerzési pur inner join hagyni del

ON pur.item_num = del.iteT_num)

A leltár inv, törölve del

AHOL inv.item_num = del.item_nurn

RAISERROR (A kiskereskedelmi ár nem korrigált a termék. ', 16,1)

A trigger alkalmazzák nyilatkozatnak nocount ON úgy, hogy amikor a ravaszt tüzek és frissíti az adatokat az Inventory táblázatban. SELECT eredmények nem jelennek meg. Ezután egy csekket fennállásának táblázatok beszúrva vagy kivágva. Ha bármelyik ezek a táblák, nincsenek feljegyzések, akkor egy olyan rendszer segítségével parancsot RAISERROR ravaszt nyomatokat szabványos üzenetet, hogy az ár-érték nem változott. A rendszer asztal SysMessages is hozzá egy egyéni üzenetet jelent sp_addmessage eljárást. majd szöveges üzenetek helyett létre, hogy adjon meg egy számot.

§ létrehozása audit rekordokat. A biztonság, vagy egyszerűen csak követni a végrehajtott műveletek az asztalon (vagy táblázatok), akkor létrehozhat egy ravasz egy adatbázisban. Adatokat gyűjt a táblázatban, írásbeli, módosított vagy törölt egy másik tábla vagy nézet.

§ Hívjon külső fellépések. A trigger hagyjuk megadni intézkedések, amelyek túlmutatnak a hagyományos adatbázis feldolgozása. Például, a 2. lecke Példát mutattunk használat egy indító xp_sendmail kiterjesztett tárolt eljárás. amely e-mailt küld üzenetet, amikor a trigger bekövetkezik.

§ megvalósítása komplex védelmét adatok integritását. Előfordul, hogy a szabvány védelmére vonatkozó adatok integritását intézkedések nem elegendőek. Például egy lépcsőzetes törlés művelet törlésére más táblákból, míg az egyszerű eltávolítás sértené a hivatkozási integritást az asztalok között. Azonban kaszkád eltávolítása nem kívánatos. Aztán törlés helyett a bejegyzéseket a kapcsolódó táblázatok helyett flop, és a törölt rekordok kerülnek egy másik tábla a későbbi ellenőrzést. Ha a rekordok törlésére helyett trigger, akkor végrehajtja a törlési műveletet használva lépcsőzetes referenciális integritás nem fog sikerülni. Ahhoz, hogy ugyanazt a feladatot kell programozni a műveletet a lépcsőzetes törlés ravaszt.

Ebben a feladatban, akkor jön létre, és ellenőrizze a ravaszt, amely rögzíti az 1 értéket oszlopban Eladott Books táblázat az adatbázisból BookShopDB adatokat. Azt is programozni a további feldolgozás, amely elvezet Eladott oszlopban az eredeti állapotába, amivel azt a 0, ha a vevő a könyvet.

4. Készítsen INSERT ravaszt egy tábla BookOrders

  1. Nyisd Query Analyzer és csatlakozzon a helyi szerverre.
  2. A szerkesztő oldali a Query ablakban adja meg és hajtsa végre az alábbi kódot:

CREATE TRIGGER dbo.update_book_status

AZ bookorders bo inner join ki i

ON bo.orderid = i.orderid)

CREATE TRIGGER utasítás létrehoz egy ravaszt nevű Update_Book_Status és nyakkendők, hogy BookOrders táblázat az adatbázisból BookShopDB. Ez a trigger akkor aktiválódik, ha az adatokat a táblázatba és frissítéseket BookOrders Eladott mező értéke a megfelelő számot TitlelD Books táblázatban.

4. kiegészítés kiváltó eltávolítását feldolgozása és az adatok frissítése táblák BookOrders

1. A szerkesztő oldali a Query ablakban adja meg és hajtsa végre az alábbi kódot:

ALTER TRIGGER dbo.update_book_status

UTÁN INSERT, DELETE

Ha létezik (SELECT * FROM behelyezve)