Adatbázisok szerver oldali programozása Előadás, 2006.05.05.

A VIK Wikiből

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>


<< Előadás, 2006.05.05. >>

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.