Trigerid kaks tabelid

SQL SERVER

Три́ггер (англ. trigger) — хранимая процедура особого типа, которую пользователь не вызывает непосредственно, а исполнение которой обусловлено действием по модификации данных: добавлением INSERT, удалением DELETE строки в заданной таблице, или изменением UPDATE данных в определённом столбце заданной таблицы реляционной базы данных.

Триггеры применяются для обеспечения целостности данных и реализации сложной бизнес-логики. Триггер запускается сервером автоматически при попытке изменения данных в таблице, с которой он связан. Все производимые им модификации данных рассматриваются как выполняемые в транзакции, в которой выполнено действие, вызвавшее срабатывание триггера. Соответственно, в случае обнаружения ошибки или нарушения целостности данных может произойти откат этой транзакции.

Запуск

Момент запуска триггера определяется с помощью ключевых слов BEFORE (триггер запускается до выполнения связанного с ним события; например, до добавления записи) или AFTER (после события). В случае, если триггер вызывается до события, он может внести изменения в модифицируемую событием запись (конечно, при условии, что событие — не удаление записи). Некоторые СУБД накладывают ограничения на операторы, которые могут быть использованы в триггере (например, может быть запрещено вносить изменения в таблицу, на которой «висит» триггер, и т. п.).

Кроме того, триггеры могут быть привязаны не к таблице, а к представлению (VIEW). В этом случае с их помощью реализуется механизм «обновляемого представления». В этом случае ключевые слова BEFORE и AFTER влияют лишь на последовательность вызова триггеров, так как собственно событие (удаление, вставка или обновление) не происходит.

В некоторых серверах триггеры могут вызываться не для каждой модифицируемой записи, а один раз на изменение таблицы. Такие триггеры называются табличными.

Trigerid kaks tabelid

Pärandtabelite loomine:

Это изображение имеет пустой атрибут alt; его имя файла - pilt-37.png

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;