SQL Server

Loome andmebaasi ja kaks tabelit

Create database trigerTARgv24;
USE trigerTARgv24;
Create table linnad(
linnID int PRIMARY KEY IDENTITY (1,1),
linnanimi varchar(15) NOT NULL,
rahvaarv int);

Create table logi(
id int PRIMARY KEY IDENTITY (1,1),
aeg DATETIME,
toiming  varchar(100),
andmed TEXT
)

Trigger lisatud kirjeid jälgimiseks tabelis “linnad” INSERT

CREATE TRIGGER linnaLisamine
ON linnad --tabelinimi, mis on vaja jälgida
FOR INSERT
AS
INSERT INTO logi(aeg, toiming, andmed)
SELECT
GETDATE(),  --aeg
'on tehtud INSERT käsk',  --toiming
inserted.linnanimi  --andmed
FROM inserted;

Trigeri tegevuse kontroll

INSERT INTO linnad(linnanimi, rahvaarv)
VALUES ('Tallinn', 600000);
SELECT * FROM linnad;
SELECT * FROM logi;
SQL Triggerite loomine
USE [trigerTARgv24]
GO
/****** Object:  Trigger [dbo].[linnaLisamine]    Script Date: 19.03.2025 09:04:08 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[linnaLisamine]
ON [dbo].[linnad] --tabelinimi, mis on vaja jälgida
FOR INSERT
AS
INSERT INTO logi(aeg, toiming, andmed)
SELECT
GETDATE(),  --aeg
'on tehtud INSERT käsk',  --toiming
CONCAT('linn: ', inserted.linnanimi, ', elanike arv: ', inserted.rahvaarv)  --andmed
FROM inserted;
SQL Triggerite loomine
SQL Triggerite loomine
ALTER TRIGGER [dbo].[linnaLisamine]
ON [dbo].[linnad] --tabelinimi, mis on vaja jälgida
FOR INSERT
AS
INSERT INTO logi(kasutaja, aeg, toiming, andmed)
SELECT
SUSER_NAME(), --USER
GETDATE(),  --aeg
'on tehtud INSERT käsk',  --toiming
CONCAT('linn: ', inserted.linnanimi, ', elanike arv: ', inserted.rahvaarv)  --andmed
FROM inserted;

Trigger eemaldatud kirjeid jälgimiseks tabelis “linnad”DELETE

CREATE TRIGGER linnaKustutamine
ON linnad --tabelinimi, mis on vaja jälgida
FOR DELETE
AS
INSERT INTO logi(kasutaja, aeg, toiming, andmed)
SELECT
SUSER_NAME(), --USER
GETDATE(),  --aeg
'on tehtud DELETE käsk',  --toiming
CONCAT('linn: ', deleted.linnanimi, ', elanike arv: ', deleted.rahvaarv)  --andmed
FROM deleted;
--kontroll
DELETE FROM linnad
WHERE linnID=1;
SELECT * FROM linnad;
SELECT * FROM logi;
CREATE TRIGGER linnaUuendamine
ON linnad --tabelinimi, mis on vaja jälgida
FOR UPDATE
AS
INSERT INTO logi(kasutaja, aeg, toiming, andmed)
SELECT
SUSER_NAME(), 
GETDATE(),  
'on tehtud UPDATE käsk',  
CONCAT('vanad andmed -linn: ', deleted.linnanimi,
', elanike arv: ', deleted.rahvaarv,
'uued andmed -linn: ', inserted.linnanimi,
', elanike arv: ', inserted.rahvaarv)  
FROM deleted
INNER JOIN inserted
ON deleted.linnID=inserted.linnID;

XAMPP

Create table linnad(
linnID int Auto_increment PRIMARY KEY,
linnanimi varchar(15),
rahvaarv int);

Create table logi(
id int Auto_increment PRIMARY KEY,
aeg DATETIME,
toiming  varchar(100),
andmed TEXT,
kasutaja varchar(50)
)
Päästikud

Trigger lisatud kirjeid jälgimiseks tabelis “linnad” INSERT

SQL Triggerite loomine

Trigger muudetud kirjeid jälgimiseks tabelis “linnad”UPDATE

SQL Triggerite loomine

Проверка:

Trigger eemaldatud kirjeid jälgimiseks tabelis “linnad”DELETE

Проверка:


Kombineerime INSERT ja DELETE triggerid

CREATE TRIGGER linnaLisamineJaKustutamine
ON linnad 
AFTER INSERT, DELETE
AS
BEGIN
	SET NOCOUNT ON;
	INSERT INTO logi(kasutaja, aeg, toiming, andmed)
	SELECT
	SUSER_NAME(),
	GETDATE(),  
	'INSERT',  
	CONCAT('linn: ', inserted.linnanimi,
	', elanike arv: ', inserted.rahvaarv)  
	FROM inserted

	UNION ALL

	SELECT
	SUSER_NAME(),
	GETDATE(),  
	'DELETE', 
	CONCAT('linn: ', deleted.linnanimi,
	', elanike arv: ', deleted.rahvaarv)  
	FROM deleted;
END

--Läbivaatus
INSERT INTO linnad(linnanimi, rahvaarv)
VALUES ('Tartu', 50000);

DELETE FROM 
    linnad
WHERE 
    linnID=2;
SELECT * FROM linnad;
SELECT * FROM logi;

--Diaktiveerib päästiku
DISABLE TRIGGER linnaLisamine
ON linnad


Triggerite loomine kahe tabeliga

Create database trigerTARgv24;
USE trigerTARgv24;

Create table linnad(
linnID int PRIMARY KEY IDENTITY (1,1),
linnanimi varchar(15) NOT NULL,
rahvaarv int);

Create table logi(
id int PRIMARY KEY IDENTITY (1,1),
aeg DATETIME,
toiming  varchar(100),
andmed TEXT
)

Create table maakond(
maakondID int PRIMARY KEY IDENTITY (1,1),
maakond varchar(100) UNIQUE,
pindala int
);

INSERT INTO maakond(maakond)
VALUES ('Harjumaa');
INSERT INTO maakond(maakond)
VALUES ('Pärnumaa');

ALTER TABLE linnad ADD maakondID int;
ALTER TABLE linnad ADD CONSTRAINT fk_maakond
FOREIGN KEY (maakondID) References maakond(maakondID) 

SELECT * FROM linnad;
SELECT * FROM maakond;
INSERT INTO linnad(linnanimi, rahvaarv, maakondID)
VALUES ('Tallinn', 600000, 1);

Trigger lisamine

Create trigger linnaLisamine
ON linnad
FOR INSERT 
AS INSERT INTO logi(aeg, toiming, andmed)
SELECT
GETDATE(),
'On tehtud INSERT',
CONCAT('Maakond: ', m.maakond, ', Linn: ', inserted.linnanimi, ', ', inserted.rahvaarv)
FROM inserted
INNER JOIN maakond m ON m.maakondID=inserted.maakondID;

Kontroll:

Trigger Kustutamine

Lisame kasutaja

ALTER TABLE logi ADD kasutaja varchar(25);
Create trigger linnaKustutamine
ON linnad
FOR DELETE 
AS INSERT INTO logi(aeg, toiming, andmed, kasutaja)
SELECT
GETDATE(),
'On tehtud DELETE',
CONCAT('Maakond: ', m.maakond, ', Linn: ', deleted.linnanimi, ', ', deleted.rahvaarv)
SUSER_NAME()
FROM deleted
INNER JOIN maakond m ON m.maakondID=deleted.maakondID;

Kontroll

Trigger Uuendamine

CREATE TRIGGER linnaUuendamine
ON linnad
FOR UPDATE
AS
INSERT INTO logi(aeg, toiming, andmed, kasutaja)
SELECT
GETDATE(),  
'On tehtud UPDATE käsk',  
CONCAT('Vanad andmed - Maakond: ', m1.maakond, ', Pindala: ', m1.pindala, ', Linn: ', deleted.linnanimi,
', ', deleted.rahvaarv,
'/ Uued andmed - Maakond: ', m2.maakond, ', Pindala: ', m2.pindala, ', Linn: ', inserted.linnanimi,
', ', inserted.rahvaarv),
SUSER_NAME()
FROM deleted
INNER JOIN inserted ON deleted.linnID=inserted.linnID
INNER JOIN maakond m1 ON m1.maakondID=deleted.maakondID
INNER JOIN maakond m2 ON m2.maakondID=inserted.maakondID;

Kontroll


XAMPP

INSERT INTO logi(kasutaja, aeg, toiming, andmed)
SELECT
USER(), 
NOW(),  
'on tehtud UPDATE käsk',  
CONCAT('Vanad andmed - Maakond: ', m1.maakond, ', Pindala: ', m1.pindala, '; Linn: ', OLD.linnanimi,
', elanike arv: ', OLD.rahvaarv,
'\n Uued andmed - Maakond: ', m2.maakond, ', Pindala: ', m2.pindala, ', Linn: ', NEW.linnanimi,
', elanike arv: ', NEW.rahvaarv)  
FROM linnad l
    INNER JOIN maakond m1 ON m1.maakondID=OLD.maakondID
    INNER JOIN maakond m2 ON m2.maakondID=NEW.maakondID
WHERE NEW.linnID=l.linnID    

Kontroll

Lisamine

INSERT INTO logi(kasutaja, aeg, toiming, andmed)
SELECT
USER(),
NOW(),
'On tehtud INSERT käsk',
CONCAT('Maakond: ', maakond, ', ', pindala, ', Linn: ', NEW.linnanimi, ', ', NEW.rahvaarv)
FROM linnad l
INNER JOIN maakond m ON l.maakondID=m.maakondID
WHERE l.linnID=NEW.linniD;

Kontroll

delete

INSERT INTO logi(kasutaja, aeg, toiming, andmed)
SELECT
USER(),
NOW(),
'On tehtud DELETE käsk',
CONCAT('Maakond: ', m.maakond, ', ', m.pindala, ', Linn: ', OLD.linnanimi, ', ', OLD.rahvaarv)
FROM linnad l
INNER JOIN maakond m ON l.maakondID=m.maakondID

Kontroll



Iseseisevtöö – trigerite ülesanne

SQL Server

Andmebaasi ja tabelite loomine

CREATE DATABASE autodDB;
USE autodDB;

CREATE TABLE autoregister(
autoID int PRIMARY KEY IDENTITY (1,1),
mark varchar(15) NOT NULL,
mudel varchar(15) NOT NULL,
aasta INT
);

CREATE TABLE logitabel(
id int PRIMARY KEY IDENTITY (1,1),
toiming  varchar(100),
aeg DATETIME,
kasutajanimi varchar(25),
autoAndmed TEXT
);

Auto Lisamine

Create trigger autoLisamine
ON autoregister
FOR INSERT
AS INSERT INTO logitabel(toiming, aeg, kasutajanimi, autoAndmed)
SELECT
'On tehtud INSERT',
GETDATE(),
SUSER_NAME(),
CONCAT('Mark: ', inserted.mark, ', Mudel: ', inserted.mudel, ', Aasta: ', inserted.aasta)
FROM inserted;

Auto Kustutamine

CREATE TRIGGER autoKustutamine
ON autoregister
FOR DELETE
AS
INSERT INTO logitabel(toiming, aeg, kasutajanimi, autoAndmed)
SELECT
'On tehtud DELETE käsk',  --toiming
GETDATE(),  --aeg
SUSER_NAME(),
CONCAT('Mark: ', deleted.mark, ', Mudel: ', deleted.mudel, ', Aasta: ', deleted.aasta)  --andmed
FROM deleted;

Auto Uuendamine

CREATE TRIGGER autoUuendamine
ON autoregister
FOR UPDATE
AS
INSERT INTO logitabel(toiming, aeg, kasutajanimi, autoAndmed)
SELECT
'On tehtud UPDATE käsk',  --toiming
GETDATE(),  --aeg
SUSER_NAME(),
CONCAT('Vanad andmed - Mark: ', deleted.mark, ', Mudel: ', deleted.mudel, ', Aasta: ', deleted.aasta,
'/ Uued andmed - Mark: ', inserted.mark, ', Mudel: ', inserted.mudel, ', Aasta: ', inserted.aasta)  --andmed
FROM deleted
INNER JOIN inserted
ON deleted.autoID=inserted.autoID;


XAMPP

Andmebaasi ja tabelite loomine

CREATE TABLE autoregister(
autoID int Auto_increment PRIMARY KEY,
mark varchar(15) NOT NULL,
mudel varchar(15) NOT NULL,
aasta INT
);
  
CREATE TABLE logitabel(
id int Auto_increment PRIMARY KEY,
toiming  varchar(100),
aeg DATETIME,
kasutajanimi varchar(25),
autoAndmed TEXT
);

Auto Lisamine

INSERT INTO logitabel(toiming, aeg, kasutajanimi, autoAndmed)
SELECT
'On tehtud INSERT käsk',
NOW(),
USER(),
CONCAT('Mark: ', NEW.mark, ', Mudel: ', NEW.mudel, ', Aasta: ', NEW.aasta);

Auto Kustutamine

INSERT INTO logitabel(toiming, aeg, kasutajanimi, autoAndmed)
SELECT
'On tehtud DELETE käsk',
NOW(),
USER(),
CONCAT('Mark: ', OLD.mark, ', Mudel: ', OLD.mudel, ', Aasta: ', OLD.aasta)

Auto Uuendamine

INSERT INTO logitabel(toiming, aeg, kasutajanimi, autoAndmed)
SELECT
'On tehtud UPDATE käsk',
NOW(),
USER(),
CONCAT('Vanad andmed - Mark: ', OLD.mark, ', Mudel: ', OLD.mudel, ', Aasta: ', OLD.aasta,
'\n\nUued andmed - Mark: ', NEW.mark, ', Mudel: ', NEW.mudel, ', Aasta: ', NEW.aasta)
FROM autoregister a
INNER JOIN autoregister ar
ON a.autoID=ar.autoID
WHERE NEW.autoID=a.autoID;



Teine ülesanne

Trigerite ülesanne, mis on esitluses “Triggerid_localhost_2tabelid.pptx” viimasel slaidil

 ▶ Lisada tabelile autoregister seotud tabel (omanikud)
 ▶ Muuta trügereid, et jälgida uuendusi ja lisamisi, nii et tabelis logitabel kuvatakse seotud tabelitest pärinevad andmed

SQL Server


CREATE TABLE omanikud (
omanikID int PRIMARY KEY IDENTITY (1,1),
nimi VARCHAR(50) NOT NULL,
aadress VARCHAR(50),
telefon VARCHAR(20)
);

ALTER TABLE autoregister ADD omanikID int;
ALTER TABLE autoregister ADD CONSTRAINT fk_omanikud
FOREIGN KEY (omanikID) References omanikud(omanikID)

Auto Lisamine

Create trigger autoLisamine
ON autoregister
FOR INSERT
AS INSERT INTO logitabel(toiming, aeg, kasutajanimi, autoAndmed)
SELECT
'On tehtud INSERT',
GETDATE(),
SUSER_NAME(),
CONCAT('Omanik: ', o.nimi, ', Mark: ', inserted.mark, ', Mudel: ', inserted.mudel, ', Aasta: ', inserted.aasta)
FROM inserted
INNER JOIN omanikud o ON o.omanikID=inserted.omanikID;

Auto Kustutamine

Create trigger autoKustutamine
ON autoregister
FOR DELETE
AS INSERT INTO logitabel(toiming, aeg, kasutajanimi, autoAndmed)
SELECT
'On tehtud DELETE',
GETDATE(),
SUSER_NAME(),
CONCAT('Omanik: ', o.nimi, ', Mark: ', deleted.mark, ', Mudel: ', deleted.mudel, ', Aasta: ', deleted.aasta)
FROM deleted
INNER JOIN omanikud o ON o.omanikID=deleted.omanikID;

Auto Uuendamine

CREATE TRIGGER autoUuendamine
ON autoregister
FOR UPDATE
AS
INSERT INTO logitabel(toiming, aeg, kasutajanimi, autoAndmed)
SELECT
'On tehtud UPDATE',
GETDATE(),
SUSER_NAME(), 
CONCAT('Vanad andmed - Omanik: ', o1.nimi, ', Telefon: ', o1.telefon,
', Auto: ', deleted.mark, ', ', deleted.mudel, ', Aasta: ', deleted.aasta,
'/ Uued andmed - Omanik: ', o2.nimi, ', Telefon: ', o2.telefon,
', Auto: ', inserted.mark, ', ', inserted.mudel, ', Aasta: ', inserted.aasta)
FROM deleted
INNER JOIN inserted ON deleted.autoID=inserted.autoID
INNER JOIN omanikud o1 ON o1.omanikID=deleted.omanikID
INNER JOIN omanikud o2 ON o2.omanikID=inserted.omanikID;

XAMPP

CREATE TABLE autoregister(
autoID int Auto_increment PRIMARY KEY,
mark varchar(15) NOT NULL,
mudel varchar(15) NOT NULL,
aasta INT
);
 
CREATE TABLE logitabel(
id int Auto_increment PRIMARY KEY,
toiming  varchar(100),
aeg DATETIME,
kasutajanimi varchar(25),
autoAndmed TEXT
);

CREATE TABLE omanikud (
omanikID int Auto_increment PRIMARY KEY,
nimi VARCHAR(50) NOT NULL,
aadress VARCHAR(50),
telefon VARCHAR(20)
);

ALTER TABLE autoregister ADD omanikID int;
ALTER TABLE autoregister ADD CONSTRAINT fk_omanikud
FOREIGN KEY (omanikID) References omanikud(omanikID)

Auto Lisamine

INSERT INTO logitabel(toiming, aeg, kasutajanimi, autoAndmed)
SELECT
'On tehtud INSERT käsk',
NOW(),
USER(),CONCAT('Omanik: ', nimi, ', ', telefon,
              '; Auto: ', NEW.mark, ', ', NEW.mudel,
              ', Aasta: ', NEW.aasta)
FROM autoregister a
INNER JOIN omanikud o ON a.omanikID=o.omanikID
WHERE a.autoID=NEW.autoiD

Auto Kustutamine

INSERT INTO logitabel(toiming, aeg, kasutajanimi, autoAndmed)
SELECT
'On tehtud DELETE käsk',
NOW(),
USER(),
CONCAT('Omanik: ', o.nimi, ', ', o.telefon,
              '; Auto: ', OLD.mark, ', ', OLD.mudel,
              ', Aasta: ', OLD.aasta)
FROM autoregister a
INNER JOIN omanikud o ON a.omanikID=o.omanikID
WHERE a.autoID=OLD.autoiD

Auto Uuendamine

INSERT INTO logitabel(toiming, aeg, kasutajanimi, autoAndmed)
SELECT
'on tehtud UPDATE käsk',
NOW(), 
USER(),
CONCAT('Vanad andmed - Omanik: ', o1.nimi, ', ', o1.telefon, 
'/  Auto: ', OLD.mark, ', ', OLD.mudel, ', Aasta: ', OLD.aasta,
'\n\nUued andmed - Omanik: ', o2.nimi, ', ', o2.telefon,
'/  Auto: ', NEW.mark, ', ', NEW.mudel, ', Aasta: ', NEW.aasta)  
FROM autoregister a
    INNER JOIN omanikud o1 ON o1.omanikID=OLD.omanikID
    INNER JOIN omanikud o2 ON o2.omanikID=NEW.omanikID
WHERE NEW.autoID=a.autoID



Kolmas ülesanne

Kasutaja loomine, kes ei näe (DENY) logi tabelit ja ei saa trigerit muuta.

SQL Server

Kasutaja loomine

Õiguste andmine

GRANT SELECT TO opilaneMariaSm;

-- DENY logi tabeli lugemise õigus
DENY SELECT, INSERT, UPDATE, DELETE ON logitabel TO opilaneMariaSm

-- DENY trigerite muutmise õigus
DENY ALTER ON OBJECT::dbo.autoregister TO opilaneMariaSm;



XAMPP

Kasutaja loomine

Õiguste andmine