SQL SERVER
Три́ггер (англ. trigger) — хранимая процедура особого типа, которую пользователь не вызывает непосредственно, а исполнение которой обусловлено действием по модификации данных: добавлением INSERT
, удалением DELETE
строки в заданной таблице, или изменением UPDATE
данных в определённом столбце заданной таблицы реляционной базы данных.
Триггеры применяются для обеспечения целостности данных и реализации сложной бизнес-логики. Триггер запускается сервером автоматически при попытке изменения данных в таблице, с которой он связан. Все производимые им модификации данных рассматриваются как выполняемые в транзакции, в которой выполнено действие, вызвавшее срабатывание триггера. Соответственно, в случае обнаружения ошибки или нарушения целостности данных может произойти откат этой транзакции.
Запуск
Момент запуска триггера определяется с помощью ключевых слов BEFORE
(триггер запускается до выполнения связанного с ним события; например, до добавления записи) или AFTER
(после события). В случае, если триггер вызывается до события, он может внести изменения в модифицируемую событием запись (конечно, при условии, что событие — не удаление записи). Некоторые СУБД накладывают ограничения на операторы, которые могут быть использованы в триггере (например, может быть запрещено вносить изменения в таблицу, на которой «висит» триггер, и т. п.).
Кроме того, триггеры могут быть привязаны не к таблице, а к представлению (VIEW). В этом случае с их помощью реализуется механизм «обновляемого представления». В этом случае ключевые слова BEFORE
и AFTER
влияют лишь на последовательность вызова триггеров, так как собственно событие (удаление, вставка или обновление) не происходит.
В некоторых серверах триггеры могут вызываться не для каждой модифицируемой записи, а один раз на изменение таблицы. Такие триггеры называются табличными.
Trigerid kaks tabelid
Pärandtabelite loomine:
Tootaja tabeli loomine:
CREATE TABLE Tootaja(
id INT PRIMARY KEY identity(1,1),
nimi VARCHAR(100),
klientID int Foreign Key References Telefoniteenus(TelefoniteenusID));

Tabelid on seotud:

Kolme kirje lisamine vanasse tabelisse:
Insert Into Telefoniteenus (kliendi_nimi,telefoninumbe,maksumus,registreeritud_alates)
Values ('Vlad Andreev','+37254885684',15,'2022-12-24');
Insert Into Telefoniteenus (kliendi_nimi,telefoninumbe,maksumus,registreeritud_alates)
Values ('Oleg Andreev','+37254885685',15,'2022-12-24');
Insert Into Telefoniteenus (kliendi_nimi,telefoninumbe,maksumus,registreeritud_alates)
Values ('Franchesco Andreev','+37254885686',15,'2022-12-24');
select * from Telefoniteenus

TRIGER MIS JÄLGIB TABELISSE LISAMINE:
CREATE TRIGGER Tootajalisamine
ON Tootaja
FOR INSERT
AS
BEGIN
INSERT INTO logi (kuupaev, andmed, kasutaja,tegevus)
SELECT GETDATE(),
CONCAT(inserted.nimi,', ',rt.kliendi_nimi),
USER,
'tootaja on lisatud'
FROM inserted
inner join Telefoniteenus rt on inserted.klientID =rt.TelefoniteenusID
END;
Kontrol:
insert into Tootaja (nimi,klientID)
values ('Oleg andreev',1)
select * from Tootaja
select * from logi

TRIGER MIS JÄLGIB TABELISSE UENDAMINE:
CREATE TRIGGER totajauuendamine
ON Tootaja
AFTER UPDATE
AS
BEGIN
INSERT INTO logi (Kuupaev, Kasutaja, Andmed, Tegevus)
SELECT GETDATE(),
USER,
CONCAT('Vanad andmed: ', deleted.nimi, ', ', rt1.kliendi_nimi, ' Uued andmed: ', inserted.nimi, ', ', rt2.kliendi_nimi),
'Tootaja on uuendatud'
FROM deleted
INNER JOIN Telefoniteenus rt1 ON deleted.klientID = rt1.TelefoniteenusID
INNER JOIN inserted ON deleted.id = inserted.id
INNER JOIN Telefoniteenus rt2 ON inserted.klientID = rt2.TelefoniteenusID
END;
Kontrol:
update Tootaja
set nimi='Oleg Olegov'
where id =3;
select * from tootaja;
select* from logi;

XAMPP:
XAMPPis käsitleti logi ja Telefoniteenuse tabeleid viimase ülesande raames ja neid ei kustutatud.

Tootaja tabeli loomine:
CREATE TABLE Tootaja(
id INT PRIMARY KEY AUTO_INCREMENT,
nimi VARCHAR(100),
klientID int,
Foreign Key (klientID) References Telefoniteenus(TelefoniteenusID));

Kolme kirje lisamine vanasse tabelisse:
Insert Into Telefoniteenus (kliendi_nimi,telefoninumbe,maksumus,registreeritud_alates)
Values ('Vlad Andreev','+37254885684',15,'2022-12-24');
Insert Into Telefoniteenus (kliendi_nimi,telefoninumbe,maksumus,registreeritud_alates)
Values ('Oleg Andreev','+37254885685',15,'2022-12-24');
Insert Into Telefoniteenus (kliendi_nimi,telefoninumbe,maksumus,registreeritud_alates)
Values ('Franchesco Andreev','+37254885686',15,'2022-12-24');
select * from Telefoniteenus
TRIGER MIS JÄLGIB TABELISSE LISAMINE:
INSERT INTO logi (Kuupaev, Andmed, Kasutaja, Tegevus)
SELECT NOW(), CONCAT(NEW.nimi, ', ', te.kliendi_nimi), USER(), 'tootaja on lisatud'
FROM Telefoniteenus te
WHERE te.TelefoniteenusID = NEW.klientID

Kontrol:
insert into Tootaja (nimi,klientID)
values ('Oleg andreev',1)
select * from Tootaja
select * from logi
Tootaja tabel:

Logi tabel:

TRIGER MIS JÄLGIB TABELISSE UUEMINE:
INSERT INTO logi (Kuupaev, Andmed, Kasutaja, Tegevus)
SELECT NOW(), CONCAT('Vanad andmed: ', OLD.nimi, ', ', te1.kliendi_nimi, ' Uued andmed: ', NEW.nimi, ', ', te2.kliendi_nimi),
USER(), 'Tootaja uuendamine'
FROM Tootaja t
INNER JOIN Telefoniteenus te1 ON OLD.klientID = te1.TelefoniteenusID
INNER JOIN Telefoniteenus te2 ON NEW.klientID = te2.TelefoniteenusID
WHERE t.id = NEW.id;

Kontrol:
update Tootaja
set nimi='Oleg Olegov'
where id =3;
select * from tootaja;
select* from logi;
Tootaja tabel:

Logi Tabel

KASUTAJAD
kasutaja ei näe logitabelit

GRANT SELECT, ALTER ON Tootaja TO OpilaneArtur;
GRANT SELECT, ALTER ON Telefoniteenus TO OpilaneArtur;
GRANT SELECT, ALTER ON Tootaja TO dsfsdfs;
GRANT SELECT, ALTER ON Telefoniteenus TO dsfsdfs;