Kokkuvõte
SQL-triggerid on andmebaasihalduse võimas tööriist, mis võimaldab automatiseerida andmetöötlust ja säilitada andmete kvaliteeti ning järjepidevust. Need on hädavajalikud keerukamate andmebaasirakenduste ja süsteemide arendamisel, kus andmete haldamine ja jälgimine on kriitilise tähtsusega.
SQL-triggerid (või päästikud) on andmebaasi objektid, mis võimaldavad automaatselt käivitada teatud toiminguid, kui andmebaasitabelis toimub kindel sündmus. Need on eriti kasulikud andmete terviklikkuse tagamiseks ja automatiseeritud tegevuste rakendamiseks.
SQL Triggerite Põhiomadused
- Automaatne käivitamine: Triggerid aktiveeruvad automaatselt, kui toimub teatud sündmus, näiteks andmete sisestamine, muutmine või kustutamine.
- Tüüpide määratlemine: Triggerid võivad olla erinevat tüüpi sõltuvalt sündmustest, mis neid käivitavad. Näiteks BEFORE-trigger käivitub enne andmeoperatsiooni teostamist, samas kui AFTER-trigger käivitub pärast andmeoperatsiooni teostamist.
- Eesmärk ja kasutamine: Triggerid on kasulikud mitmetes olukordades, näiteks logimise ja jälgimise süsteemide loomisel, andmete valideerimisel enne nende salvestamist ning automatiseeritud teavituste saatmisel.
- Andmebaasi terviklikkus: Triggerid aitavad säilitada andmete terviklikkust ja järjepidevust, rakendades äriloogikat, mis ei ole alati lihtsalt andmebaasitabelite struktuuri kaudu võimalik.
- Tsentraliseeritud äriloogika: Triggerid võimaldavad äriloogika tsentraliseerimist, mis tähendab, et teatud reeglid ja protseduurid saab määratleda ühes kohas, mitte erinevates rakendustes või teenustes.
Näide: Triggeri loomine ja kasutamine
Andmebaasi loomine ja tabeli määratlemine
CREATE DATABASE trigerTARpv23;
USE trigerTARpv23;
-- Tabel toode
CREATE TABLE toode (
toodeId INT PRIMARY KEY AUTO_INCREMENT,
toodeNimi VARCHAR(50),
hind INT
);
-- Logitabel
CREATE TABLE logi (
id INT PRIMARY KEY AUTO_INCREMENT,
kasutaja VARCHAR(100),
kuupaev DATETIME,
sisestatudAndmed TEXT
);
INSERT-trigger
CREATE TRIGGER toodeLisamine
ON toode
FOR INSERT
AS
INSERT INTO logi(kasutaja, kuupaev, sisestatudAndmed)
SELECT
USER,
GETDATE(),
CONCAT('Lisatud andmed: ', inserted.toodeNimi, ', ', inserted.hind)
FROM inserted;
DELETE-trigger
CREATE TRIGGER toodeKustutamine
ON toode
FOR DELETE
AS
INSERT INTO logi(kasutaja, kuupaev, sisestatudAndmed)
SELECT
USER,
GETDATE(),
CONCAT('Kustutatud andmed: ', deleted.toodeNimi, ', ', deleted.hind)
FROM deleted;
UPDATE-trigger
CREATE TRIGGER toodeUuendamine
ON toode
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;
TV_Shop Ülesanne
Andmebaasi ja tabelite loomine
CREATE DATABASE TV_Shop;
USE TV_Shop;
-- Tabel TV_baas
CREATE TABLE TV_baas (
TV_ID INT PRIMARY KEY AUTO_INCREMENT,
TV_mudel VARCHAR(100) NOT NULL,
TV_suurus INT NOT NULL
);
-- Logitabel
CREATE TABLE logi (
logiID INT PRIMARY KEY AUTO_INCREMENT,
kasutaja VARCHAR(100),
kuupaev DATETIME DEFAULT CURRENT_TIMESTAMP,
sisestatudAndmed TEXT
);
INSERT-trigger
CREATE TRIGGER InsertTV
ON TV_baas
FOR INSERT
AS
INSERT INTO logi(kasutaja, kuupaev, sisestatudAndmed)
SELECT
USER,
GETDATE(),
CONCAT('Lisatud andmed: TV_mudel=', inserted.TV_mudel, ', TV_suurus=', inserted.TV_suurus)
FROM inserted;
DELETE-trigger
CREATE TRIGGER DeleteTV
ON TV_baas
FOR DELETE
AS
INSERT INTO logi(kasutaja, kuupaev, sisestatudAndmed)
SELECT
USER,
GETDATE(),
CONCAT('Kustutatud andmed: TV_mudel=', deleted.TV_mudel, ', TV_suurus=', deleted.TV_suurus)
FROM deleted;
UPDATE-trigger
CREATE TRIGGER DeleteTV
ON TV_baas
FOR DELETE
AS
INSERT INTO logi(kasutaja, kuupaev, sisestatudAndmed)
SELECT
USER,
GETDATE(),
CONCAT('Kustutatud andmed: TV_mudel=', deleted.TV_mudel, ', TV_suurus=', deleted.TV_suurus)
FROM deleted;
Andmete lisamine, uuendamine ja kustutamine
INSERT INTO TV_baas (TV_mudel, TV_suurus)
VALUES ('za1', 120), ('za2', 140), ('za3', 250);
UPDATE TV_baas SET TV_mudel = 'za6' WHERE TV_ID = 2;
DELETE FROM TV_baas WHERE TV_mudel = 'za1';