Adatbázisok szerver oldali programozása Előadás, 2006.05.05.
Ez az oldal a korábbi SCH wikiről lett áthozva.
Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!
Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.
<style> code.pre { white-space: pre; display:block; mergin-top: 2px; margin-bottom: 2px;} li { line-height: 18px; } </style>
T-SQL Triggerek
Esemény lehet:
- INSERT
- UPDATE
- DELETE
- SQL Server 2005-ben DDL utasítások is
Milyen objektumra definiálható DML trigger?
- tábla
- nézet
Mikor fut le?
- esemény után (csak táblára) kulcsszó: =AFTER= ~ =FOR=
- helyette (táblára és nézetre is) kulcsszó: =INSTEAD OF=
Kedvenc vizsgakérdés: Triggerek csoportosítása.
Pl.:
CREATE TRIGGER nev ON {tábla|nezet} [WITH ENCRYPTION] {AFTER|FOR|INSTEAD OF} {DELETE|INSERT|UPDATE} AS SQL_utasítások
régi adatok: deleted.
új adatok: inserted.
ezek átmeneti táblák, táblaként kell kezelni
- SQL Serveren csak utasítás trigger van, sor trigger nincs.
- Sor szintű vizsgálatot csak kurzorral lehet csinálni.
Módosult oszlopok lekérdezése:
IF update(oszlopnév) ...
- =INSERT= : minden oszlopra true-t ad vissza
- =DELETE= : nem használható
- =UPDATE= : TRUE ha módosult
=IF COLUMNS_UPDATED(bitmaszk) ...= - n. oszlop 1 << (n-1)
Megkötések:
- batchen belül egyedüli utasításnak kell lennie, addig tart, ameddig a batch
- 1 trigger 1 táblára definiálható
- 1 táblára több trigger is lehet, ezeknek a lefutási sorrendje véletlen
Módosítás:
=ALTER TRIGGER=
Törlés:
=DROP TRIGGER=, tábla törlése esetén magától törlődik
Pl.:
ALTER TABLE felkesz ADD felkesz_ar FLOAT
-feltesszük hogy már ki van töltve-
CREATE TRIGGER felkesz_ar_update ON felkesz_angyag AFTER INSERT, DELETE, UPDATE AS DECLARE @db1 INT, @db2 INT SELECT @db1 = COUNT(*) FROM deleted SELECT @db2 = COUNT(*) FROM inserted IF @db1 > 0 AND @db2 > 0 //update volt BEGIN UPDATE felkesz SET felkesz_ar = felkesz_ar - deleted.fa_mennyiseg * anyag_egysegar + inserted.fa_mennyiseg * anyag_egysegar FROM anyag, deleted, inserted WHERE anyag_id =inserted.fa_anyagid AND felkesz:id = deleted.fa_felkeszid END IF @db2 = 0 //delete volt BEGIN ... END IF @db1 = 0 //insert volt BEGIN ... END GO
Ha fa_anyagid vagy fa_felkeszid is módosulhat, külön le kell kezelni.
DDL trigger (2005)
=CREATE, DROP, ALTER, GRANT, DENY, REVOKE= utasításokra írható.
CREATE TRIGGER nev ON {ALL SERVER|DATABASE} [WITH {ENCRYPTION|EXECUTE AS {CALLER|SELF|username}}] {FOR|AFTER} {esemény típus| esemény csoport} [,...] AS SQL utasítások
esemény lehet pl.:
adatbázis hatókörű:
- =ALTER_FUNCTION=
- =CREATE_TABLE=
- =CREATE_USER=
- =DROP_TRIGGER=
szerver hatókörű:
- =CREATE_DATABASE=
- =DROP_LOGIN=
esemény csopotok pl.:
- =DDL_TABLE_EVENTS=
- =DDL_FUNCTION_EVENTS=
Hibakezelés:
Hiba szerkezete:
- szám
- üzenet
- fontosság
- állapotkód
- eljárásnév, ahol generálódott
- sor száma
Szerver hibák: master.dbo.sysmessages
Felhasználói hibák: sysmessages
- bővítés : sp_addmessage
- törlés : sp_dropmessage
=@@ERROR= = 0 , ha sikeres volt az utolsó utasítás, egyebkent hibakód
Hiba dobása:
RAISERROR ({sg_id|msg_str}, severity, state, [arg1,...]) [WITH option1, ...]
SQL Server 2005 exception kezelés
BEGIN TRY SQL utasítások END TRY BEGIN CATCH SQL utasítások END CATCH
Olyan hibákat kap el, aminek a fontossága > 10, és nem bontja a kapcsolatot
Megkötések:
- nem tarthat több batch-en/blokk-on keresztül
- felhasználói függvényben nem használható
Hiba paramétereit lekérő függvények:
- =ERROR_NUMBER()=
- =ERROR_SEVERITY()=
- =ERROR_STATE()=
- =ERROR_PROCEDURE()=
- =ERROR_LINE()=
- =ERROR_MESSAGE()=
-- Matyi - 2006.09.23.