
Sissejuhatus: miks SQL Triggerid on olulised
SQL triggerid on võimsad tööriistad, millest iga andmebaasidega tegelev DBA ja arendaja peaks aru saama. Eelkõige võimaldavad need käivitajad määrata SQL-toiminguid, mis täituvad automaatselt, kui andmebaasis toimuvad konkreetsed sündmused. Näiteks saate konfi7gureerida päästikut, et värskendada kirjet ühes tabelis alati, kui kirje on sisestatud teise tabelisse.
Selles artiklis saate teada, millised on SQL-i triggerid, kuidas need töötavad ja kuidas neid oma andmebaasis kasutada. Seda juhendit järgides saab peagi SQL-is käivitajate (päästikute) asjatundjaks!
Mis on SQL-is trigger?
Päästik on andmebaasiobjekt, mis sisaldab SQL-loogikat ja käivitub automaatselt, kui toimub konkreetne andmebaasisündmus. Selgituseks aktiveerib ta vastuseks konkreetsetele sündmustele, muutes selle tõhusaks meetodiks teatud andmebaasitoimingute automatiseerimiseks.
Pealegi seostuvad SQL-i käivitajad üldjuhul kindlate tabelitega. Järelikult tabeli kustutamisel eemaldatakse ka kõik sellega seotud triggerid. Seega saab SQL-i päästikule tugineda enne või pärast järgmisi sündmusi:
- INSERT: See sündmus toimub siis, kui tabelisse lisatakse uus rida.
- UPDATE: See tegevus toimub tabeli olemasoleva rea muutmisel.
- DELETE: See sündmus toimub siis, kui tabelis olev rida eemaldatakse.
Kuidas triggerid SQL-is töötavad
Kui INSERT, UPDATE või DELETE SQL-päring käivitub, tegeleb RDBMS automaatselt vastava päästiku laskmisega. See protsess mitte ainult ei aita säilitada andmete terviklikkust, vaid tagab ka, et vajalikud toimingud toimuvad järjepidevalt.
Näiteks võivad käivitajad jõustada ärireegleid või säilitada auditiradu ilma täiendava kodeerimispingutuseta. Selle tulemusena ühtlustavad nad andmebaasioperatsioonide üldist haldamist.
SQL triggerite kasutamise eelised
Lisaks pakuvad SQL triggerid mitmeid eeliseid, mis suurendavad andmebaasi funktsionaalsust. Esiteks automatiseerivad nad rutiinseid ülesandeid, mis minimeerivad inimlikke eksimusi. Teiseks tagavad nad, et andmed püsivad sidusalt seotud tabelites, parandades seeläbi andmete terviklikkust.
Peale selle võivad käivitajad aidata muudatuste auditeerimisel, logides sisse andmebaasis esinevad toimingud. Sellest tulenevalt on need väärtuslikuks vahendiks andmete modifikatsioonide jälgimiseks aja jooksul.
Järeldus
Kokkuvõtvalt võib öelda, et SQL triggerid on efektiivse andmebaasihalduse olulised komponendid. Rakendades neid automatiseeritud meetmeid, saate suurendada oma andmebaasisüsteemide funktsionaalsust ja töökindlust, mis toob kaasa tõhusamad toimingud ja rakenduse tulemuslikkuse parandamise.
CREATE DATABASE trigerTARpv23;
USE trigerTARpv23;
--loome tabeli
CREATE TABLE toode(
toodeId int primary key identity (1,1),
toodeNimi varchar(50),
hind int);
--loome tabeli, mis täidab triger
CREATE TABLE logi(
id int primary key identity (1,1),
kasutaja varchar(100),
kuupaev datetime,
sisestatudAndmed text);
Insert trigger – a trigger that tracks the inclusion of data in a table and makes a log in the table of the corresponding entry
--LISAMINE
create trigger toodeLisamine
on toode -- tabel mis jälgitakse
for insert
as
insert into logi(kasutaja, kuupaev, sisestatudAndmed)
select
user,
getdate(),
concat('lisatud andmed', inserted.toodeNimi, ', ', inserted.hind)
from inserted
--kontroll
--kontrollimiseks lisame toode
INSERT INTO toode(toodenimi, hind)
VALUES ('magus õun', 10);
SELECT * FROM toode;
SELECT * FROM logi;

--KUSTUTAMINE
create trigger toodeKustutamine
on toode -- tabel mis jälgitakse
for DELETE
as
insert into logi(kasutaja, kuupaev, sisestatudAndmed)
select
user,
getdate(),
concat('kustutatud andmed', deleted.toodeNimi, ', ', deleted.hind)
from deleted
--kontroll
--kontrollimiseks kustutame toode tabelis toode
DELETE FROM toode
WHERE toodeId=1;
SELECT * FROM toode;
SELECT * FROM logi;

--Uuendamine
create trigger toodeUuendamine
on toode -- tabel mis jälgitakse
for UPDATE
as
insert into logi(kasutaja, kuupaev, sisestatudAndmed)
select
user,
getdate(),
concat('vanad andmed: ', deleted.toodeNimi, ', ', deleted.hind, ' Uued andmed: ', inserted.toodenimi, ', ', inserted.hind)
from deleted INNER JOIN inserted
ON deleted.toodeId=inserted.toodeId
--kontroll
--kontrollimiseks uuendame toode
SELECT * FROM toode;
UPDATE toode SET toodeNimi='orange melon'
WHERE toodeId=2;
SELECT * FROM toode;
SELECT * FROM logi;

SQL Server CREATE TRIGGER
example
1) Create a table for logging the changes
CREATE DATABASE production;
USE production;
--1) Create a table for logging the changes
CREATE TABLE product_audits(
change_id INT IDENTITY PRIMARY KEY,
product_id INT NOT NULL,
product_name VARCHAR(255) NOT NULL,
brand_id INT NOT NULL,
category_id INT NOT NULL,
model_year SMALLINT NOT NULL,
list_price DEC(10,2) NOT NULL,
updated_at DATETIME NOT NULL,
operation CHAR(3) NOT NULL,
CHECK(operation = 'INS' or operation='DEL')
);
-- CATEGORIES
CREATE TABLE categories (
category_id INT IDENTITY (1, 1) PRIMARY KEY,
category_name VARCHAR (255) NOT NULL
);
-- BRANDS
CREATE TABLE brands (
brand_id INT IDENTITY (1, 1) PRIMARY KEY,
brand_name VARCHAR (255) NOT NULL
);
-- PRODUCTS
CREATE TABLE products (
product_id INT IDENTITY (1, 1) PRIMARY KEY,
product_name VARCHAR (255) NOT NULL,
brand_id INT NOT NULL,
category_id INT NOT NULL,
model_year SMALLINT NOT NULL,
list_price DECIMAL (10, 2) NOT NULL,
FOREIGN KEY (category_id)
REFERENCES categories (category_id)
ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (brand_id)
REFERENCES brands (brand_id)
ON DELETE CASCADE ON UPDATE CASCADE
);
2) Creating an after DML trigger
--2) Creating an after DML trigger
CREATE TRIGGER trg_product_audit
ON products
AFTER INSERT, DELETE
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO product_audits(
product_id,
product_name,
brand_id,
category_id,
model_year,
list_price,
updated_at,
operation
)
SELECT
i.product_id,
product_name,
brand_id,
category_id,
model_year,
i.list_price,
GETDATE(),
'INS'
FROM
inserted i
UNION ALL
SELECT
d.product_id,
product_name,
brand_id,
category_id,
model_year,
d.list_price,
GETDATE(),
'DEL'
FROM
deleted d;
END
--kontroll
INSERT INTO categories (category_name) VALUES ('Electronica');
INSERT INTO brands (brand_name) VALUES ('Brand');
INSERT INTO products(
product_name,
brand_id,
category_id,
model_year,
list_price
)
VALUES (
'Test product',
1,
1,
2018,
599
);
SELECT * FROM product_audits;
DELETE FROM products WHERE product_id = 322;
SELECT * FROM product_audits;

XAMPP trigerid
TOODE LISAMINE

insert into logi(kasutaja, kuupaev, sisestatudAndmed)
VALUES (
user (),
NOW(),
concat('lisatud andmed', NEW.toodeNimi, ', ', NEW.hind))
INSERT INTO toode(toodenimi, hind)
VALUES ('magus õun', 10);
SELECT * FROM toode;
SELECT * FROM logi;


DESCRIPTION OF PRODUCTS

insert into logi(kasutaja, kuupaev, sisestatudAndmed)
VALUES (
user (),
NOW(),
concat('kustutatud andmed', OLD.toodeNimi, ', ', OLD.hind))
DELETE FROM toode
WHERE toodeId=1;
SELECT * FROM toode;
SELECT * FROM logi;

FUTURE OF PRODUCTS

insert into logi(kasutaja, kuupaev, sisestatudAndmed)
VALUES (
user (),
NOW(),
concat('vanad andmed: ', OLD.toodeNimi, ', ', OLD.hind, ' Uued andmed: ', NEW.toodenimi, ', ', NEW.hind))


Task “animals”
Database name – loomadAndmebaas
--LOOMADANDMEBAAS
CREATE DATABASE loomadAndmebaas;
USE loomadAndmebaas;

Tabelinimi, andmete sisestamiseks ja väljade nimed tabelis, nt. Loo tabel loomad (id, loomaliik ,nimi, vanus, värv)
--LOOMAD
CREATE TABLE loomad(
id int primary key identity (1,1),
loomaliik varchar(50),
nimi varchar(50),
vanus int,
varv varchar(50));
Loo tabel trigerite töö salvestamiseks. Näiteks tabel logi (logiID, kuupaev, andmed, kasutaja)
--loome tabeli, mis täidab triger
CREATE TABLE logi(
logiID int primary key identity(1,1),
kasutaja varchar(100),
kuupaev datetime,
andmed text);

Trigerinimed ja mida triger peab tegema seoses eelnevalt loodud tabeliga (INSERT, UPDATE, DELETE)
INSERT
--INSERT
create trigger loomadLisamine
on loomad
for insert
as
insert into logi(kasutaja, kuupaev, andmed)
select
user,
getdate(),
concat('lisatud andmed', inserted.loomaliik, ', ', inserted.nimi, ', ', inserted.vanus, ', ', inserted.varv)
from inserted
SELECT * FROM logi;
UPDATE
--UPDATE
create trigger loomadUuendamine
on loomad
for UPDATE
as
insert into logi(kasutaja, kuupaev, andmed)
select
user,
getdate(),
concat('vanad andmed: ', deleted.loomaliik, ', ', deleted.nimi, ', ', deleted.vanus, ', ', deleted.varv, ' Uued andmed: ',inserted.loomaliik, ', ', inserted.nimi, ', ', inserted.vanus, ', ', inserted.varv)
from deleted INNER JOIN inserted
ON deleted.id=inserted.id
SELECT * FROM logi;
DELETE
--DELETE
create trigger loomadKustutamine
on loomad
for DELETE
as
insert into logi(kasutaja, kuupaev, andmed)
select
user,
getdate(),
concat('kustutatud andmed',deleted.loomaliik, ', ', deleted.nimi, ', ', deleted.vanus, ', ', deleted.varv)
from deleted
Kasutajanimi, kes saab töötada ainult varem loodud tabeliga (Kasutajanimi – loomaarst. Parool – 12345)


Kasutaja õigused
GRANT INSERT, SELECT, UPDATE, DELETE ON loomad TO loomaarst;
Kasutajaõiguste kontroll
INSERT
SELECT * FROM loomad
INSERT INTO loomad(loomaliik, nimi, vanus, varv)
VALUES ('karu', 'Valeria', 1, 'valge'),
('ahv', 'Bob', 2, 'prune'),
('delfiin', 'Roxy', 5, 'sinine'),
('kass', 'Murzik', 3, 'punakollane'),
('koer', 'Dobi', 4, 'valge');

UPDATE
SELECT * FROM loomad;
UPDATE loomad SET varv ='pruun'
WHERE id=5;
SELECT * FROM loomad;

DELETE
DELETE FROM loomad
WHERE id =1;
SELECT * FROM loomad;

Kasutajaõiguste kontroll tabelile logi

LOGI tabeli käivitamine

XAMPP
Andmebaasinimi – loomadAndmebaas
Tabelinimi, andmete sisestamiseks ja väljade nimed tabelis, nt. Loo tabel loomad (id, loomaliik ,nimi, vanus, värv)

Loo tabel trigerite (Päästikute) töö salvestamiseks. Näiteks tabel logi (logiID, kuupaev, andmed, kasutaja)


Trigerinimed ja mida triger peab tegema seoses eelnevalt loodud tabeliga (INSERT, UPDATE, DELETE)
LOOMAD LISAMINE

LOOMAD UUENDAMINE

LOOMAD KUSTUTAMINE


Kasutajanimi, kes saab töötada ainult varem loodud tabeliga (Kasutajanimi – loomaarst. Parool – 12345)




Kasutajaõiguste kontroll
INSERT


UPDATE


DELETE


Kasutajaõiguste kontroll tabelile logi (Kasutajanimi – loomaarst)

LOGI tabeli käivitamine


SQL Server Trigerid kahe seotud tabelite põhjal
CREATE DATABASE loomadAndmebaas;
USE loomadAndmebaas;
--LOOMAD
CREATE TABLE loomad(
id INT PRIMARY KEY IDENTITY(1,1),
loomaliik VARCHAR(50),
nimi VARCHAR(50),
vanus INT,
varv VARCHAR(50)
);
INSERT INTO loomad (loomaliik, nimi, vanus, varv)
VALUES ('karu', 'Valeria', 1, 'valge'),
('ahv', 'Bob', 2, 'prune');
--LOGI
CREATE TABLE logi(
id INT PRIMARY KEY IDENTITY(1,1),
aeg DATETIME,
toiming VARCHAR(100),
kasutaja VARCHAR(200),
andmed TEXT
);
--OMANIK
CREATE TABLE omanik(
omanikID INT PRIMARY KEY IDENTITY(1,1),
nimi VARCHAR(100) UNIQUE,
perekonnanimi VARCHAR(50),
sunniaeg DATE
);
INSERT INTO omanik (nimi, perekonnanimi, sunniaeg)
VALUES ('Daria', 'Halchenko', '2006-10-06'),
('Valeria', 'Allik', '2006-03-25');
ALTER TABLE loomad ADD omanikID int;
ALTER TABLE loomad ADD CONSTRAINT fk_omanik
FOREIGN KEY (omanikID) REFERENCES omanik(omanikID);
Select * from omanik;
select * from loomad;
Loomad Lisamine
CREATE TRIGGER loomadLisamine
ON loomad
FOR INSERT
AS
INSERT INTO logi(kasutaja, aeg, toiming, andmed)
SELECT USER, GETDATE(), 'loomad on lisatud',
CONCAT(i.loomaliik, ', ', o.nimi)
FROM inserted i
INNER JOIN omanik o
ON o.omanikID = i.omanikID;
--kontrollimiseks
INSERT INTO loomad (loomaliik, nimi, vanus, varv, omanikID)
VALUES ('karu', 'Marta', 3, 'pruun', 1),
('delfiin', 'Roxy', 5, 'sinine', 2),
('kass', 'Murzik', 3, 'punakollane', 1),
('koer', 'Dobi', 4, 'valge', 2);
SELECT * FROM loomad;
SELECT * FROM logi;

Loomad Kustutamine
create trigger loomadKustutamine
on loomad
for delete
as insert into logi(kasutaja, aeg, toiming, andmed)
select user, getdate(), 'Loomad on kustutatud', concat(deleted.loomaliik, ', ', o.nimi)
from deleted
inner join omanik o
on deleted.omanikID=o.omanikID
--kontroll
delete from loomad
where id=1;
SELECT * FROM loomad;
SELECT * FROM logi;

LoomadUuendamine
create trigger loomadUuendamine
on loomad
for update
as
insert into logi(kasutaja, aeg, toiming, andmed)
select user, getdate(), 'Loomad on uuendatud', concat('Vanad andmed : ', deleted.loomaliik, ', ', o1.nimi,
'Uuendanud andmed : ', inserted.loomaliik, ', ', o2.nimi)
from deleted
inner join inserted on deleted.id=inserted.id
inner join omanik o1 on deleted.omanikID=o1.omanikID
inner join omanik o2 on inserted.omanikID=o2.omanikID;
update loomad set loomaliik='jänes', omanikID=5
where id=5;
select * from loomad;
select * from logi;
XAMPP Trigerid kahe seotud tabelite põhjal
Loomad Lisamine


Loomad Kustutamine

LoomadUuendamine

