SQL Server Trigerid kahe seotud tabelite põhjal

Mis on SQL serveris trigger?

Trigger on erisorti hoitud protseduur, mida tehakse automaatselt sündmuse tekkimisel andmebaasi serveris. DML-i triggerid tehakse siis, kui kasutaja püüab andmeid muuta andmetöötluskeele sündmuste abil (DML). DML-i sündmusteks on tabelis või esituses rakendatavad INSERT, UPDATE või DELETE protseduurid. Need triggerid käivituvad mistahes lubatud sündmuse käivitamisel sõltumata puudutatud tabeliridade olemasolust ja arvust.

DDL-i triggerid aktiveeruvad vastuseks andmekirjelduse keele erinevatele sündmustele (DDL). Need sündmused vastavad eelkõige Transact-SQL CREATE, ALTER, DROP juhistele ja mõningatele süsteemsetele salvestatud protseduuridele, mis sooritavad DDL-ga sarnaseid operatsioone.

Sisselogimise triggerid saavad tööle panna vastuseks LOGON sündmusele, mis tekib kasutajaseansi loomisel. Saate luua triggereid otse Transact-SQL juhenditest või komplekteerimismeetoditest, mis on loodud Microsofti .NET Framework platvormi CLR keskkonnas ja mis on edastatud SQL Serveri eksemplari. SQL Server võimaldab luua mitu triggerit iga konkreetse juhendi jaoks.

Märkused DML-i triggerite kohta.

DML triggereid kasutatakse sageli ärireeglite rakendamiseks ja andmete terviklikkuse tagamiseks. SQL Server võimaldab deklaratiivset linkide terviklikkust (DRI) ALTER TABLE ja CREATE TABLE juhendite abil. Kuid viidatava terviklikkuse deklaratiivne piiramine ei taga viidatavat terviklikkust andmekogude vahel. Viitelise terviklikkuse piiramine tähendab tabelite esmaste ja väliste võtmete vaheliste sidereeglite täitmist. Viiteterviklikkuse piirangute tagamiseks kasutage ALTER TABLE ja CREATE TABLE juhendites PRIMARY KEY ja FOREIGN KEY piiranguid. Kui piirangud kehtivad triggeri tabelile, kontrollitakse neid pärast triggeri INSTEAD OF täitmist, kuid enne AFTERi triggeri täitmist. Kui tuvastatakse piirangute rikkumine, tehakse INSTEAD OF-i triggerile tagasilöök ja AFTER-i trigger ei käivitu.


create database triger2tabelid;
use triger2tabelid;


Create table linnad(
linnID int PRIMARY KEY identity(1,1),
linnanimi varchar(15),
rahvaarv int);


Create table logi(
id int PRIMARY KEY identity(1,1),
aeg DATETIME,
toiming  varchar(100),
kasutaja varchar (200),
andmed text
);


CREATE TABLE maakond(
maakondID int Primary KEY identity(1,1),
maakond varchar(100) UNIQUE);
INSERT INTO maakond(maakond)
VALUES ('Harjumaa');
INSERT INTO maakond(maakond)
VALUES ('Pärnumaa');
SELECT * FROM maakond

-- seoste loomine linnad --> maakond
ALTER TABLE linnad ADD maakondID int;
ALTER TABLE linnad ADD CONSTRAINT fk_maakond
FOREIGN KEY (maakondID) References maakond(maakondID) 

select * from maakond ;
select * from linnad ;

Insert trigger

See trigger lisab tabelisse andmed toote lisamise kohta, mis võetakse INSERTED virtuaalsest tabelist.

create trigger linnaLisamine
on linnad
for insert
as insert into logi(kasutaja, aeg, toiming, andmed)
select user, getdate(), 'linn on lisatud', concat(l.linnanimi, ', ', m.maakond)
from linnad l
inner join maakond m 
on m.maakondID=l.maakondID

--kontrollimiseks
insert into linnad(linnanimi, rahvaarv, maakondID)
values ('Tallinn', 436863, 1);

select * from linnad;
select * from logi;

Delete trigger

Nii nagu eelmise triggeri puhul, paneme ka siia tabelisse kustutatud andmete info.

-- kustutamine

create trigger linnaKustutamine
on linnad
for delete
as insert into logi(kasutaja, aeg, toiming, andmed)
select user, getdate(), 'linn on kustutatud', concat(deleted.linnanimi, ', ', m.maakond)
from deleted
inner join maakond m 
on deleted.maakondID=m.maakondID

--kontroll
delete from linnad 
where linnID=1;

select * from linnad;
select * from logi;

Update trigger

Andmevärskenduse trigger käivitub UPDATE operatsiooni sooritamisel. Ja sellises triggeris saame kasutada kahte virtuaalset tabelit.

-- uuesndamine

create trigger linnaUuendamine
on linnad
for update
as 
insert into logi(kasutaja, aeg, toiming, andmed)
select user, getdate(), 'linn on kustutatud', concat('Vanad andmed : ', deleted.linnanimi, ', ', m1.maakond,
'Uuendanud andmed : ', inserted.linnanimi, ', ', m2.maakond)
from deleted
inner join inserted on deleted.linnID=inserted.linnID
inner join maakond m1 on deleted.maakondID=m1.maakondID
inner join maakond m2 on inserted.maakondID=m2.maakondID;
update linnad set linnanimi='Tallinn-Väike', maakondID=2
where linnID=2;

select * from linnad;

Comments

Lisa kommentaar

Sinu e-postiaadressi ei avaldata. Nõutavad väljad on tähistatud *-ga