Päästikprotsess

Päästikprotsess

Andmebaasides saab toiminguid ka automaatselt tööle panna. Näiteks kui soovitakse mõningates tabelites toimunud muutused soovitud kohtadesse kokku logisse lugeda.

CREATE TABLE logi(
  id INT IDENTITY PRIMARY KEY,
  aeg DATETIME,
  toiming VARCHAR(20),
  andmed VARCHAR(20),
)

SQL 2005 võimaldab luua päästikuid ka DDL käskudele e. CREATE, ALTER ja DROP käskudele!

Loomine TRIGGERI LISAMINE

Järgnev päästik kannab iga linnade tabelis toimunud muutuse kohta teate logitabelisse. Salapärane nimi “inserted” tähendab päästiku sees kasutatavat ajutist tabelit, mille kaudu saab kätte lisatud rea. Selle ajutise inserted-tabeli tulpade nimed ja tüübid on samad kui tegelikul tabelil, millega muutus toimus – siinjuhul tabel nimega linnad. Siin küsitakse linnanimi kõigepealt eraldi muutujasse, et seda oleks mugavam päästiku raames toimuva lisamise juures kasutada.

CREATE TRIGGER linnamuutus 
ON linnad
FOR INSERT 
AS
INSERT INTO logi (aeg, toiming, andmed)
SELECT GETDATE(), 'lisati', linnanimi
FROM inserted
Käivitus

Kui juhtutakse linnade tabelisse andmeid lisama, siis näen kahel korral teateid, et “ühele reale mõjus muutus”. Üks teade on siis algse lisamise kohta ning teine teade päästiku abil toimunud logikande kohta.

INSERT INTO linnad(linnanimi, rahvaarv)
VALUES ('Valga', 25000)

Nõnda iga muutuse korral.

INSERT INTO linnad(linnanimi, rahvaarv)
VALUES ('Jõgeva', 17000)

Ja kui edasi minna ja vaadata, mis logisse kirjutatud, siis on teated ilusti näha. Mitmes sündmus, millal, mida tehti ja millise linnaga on tegemist.

SELECT * FROM logi

SELECT * FROM Linnad

Edasijõudnutele 44
Pikemad päringud 44
Keerukamad seosed tabelite vahel 57
Alampäringud 66
Lisavõimalused

Triggerid SQL Server

TABEL linnad:

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

TABEL logiI:

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

TRIGGERI LISAMINE:

CREATE TRIGGER linnaLisamine
ON linnad
FOR INSERT
AS
INSERT INTO logi(aeg, toiming, andmed, kasutaja)
SELECT GETDATE(), 'linn on lisatud', 
inserted.linnanimi, USER
FROM inserted

Kontrollimiseks:

INSERT INTO linnad(linnanimi, rahvaarv)
VAlues ('Tallinn', 600000);
SELECT * FROM linnad;
select * from logi

Triggeri sisu muutmine:

ALTER TRIGGER [dbo].[linnaLisamine]
ON [dbo].[linnad]
FOR INSERT
AS
INSERT INTO logi(aeg, toiming, andmed, kasutaja)
SELECT GETDATE(), 'linn on lisatud', 
concat(inserted.linnanimi, ', ', inserted.rahvaarv),
USER
FROM inserted

Kontrollimiseks:

Delete from linnad
Where linnID = 1;
select * from linnad;
select * from logi

Trigger, mis jälgib andmete uuendamine tabelis linnad

CREATE TRIGGER linnaUuendamine
ON linnad
FOR UPDATE
AS
INSERT INTO logi(aeg, toiming, andmed, kasutaja)
SELECT GETDATE(), 'linn on uuendatud', 
concat('vanad andmed: ', deleted.linnanimi, ', ',deleted.rahvaarv,
 ' uued andmed: ', inserted.linnanimi, ', ',inserted.rahvaarv),
USER
FROM deleted INNER JOIN inserted
ON inserted.linnID=deleted.linnID

Kontrollimiseks:

update linnad 
set linnanimi='Pärnu',rahvaarv=20083
where linnID=2;
select * from linnad;
select * from logi