Noorem Tarkvaraarendaja eriala

SQL TRIGGERID

Trigger – protsess, mille abil tema sisse kirjutatud tegevused automatselt käivitakse.

SQL
CREATE DATABASE TRIGGERKudriashevTARpv23;
USE TRIGGERKudriashevTARpv23;
--loome tabeli
CREATE TABLE toode(
toodeId int PRIMARY KEY identity(1,1),
toodeNimi varchar(50),
hind int);
--loome tabeli, mis täidab trigger
CREATE TABLE logi(
id int PRIMARY KEY identity(1,1),
kasutaja varchar(100),
kuupaev datetime,
sisestatudAndmed text);
-- INSERT TRIGGER - trigger, mis jälgib andmete lisamine tabelisse ja teeb vastava kirje tabelis logi
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;
INSERT INTO toode(toodeNimi, hind)
VALUES ('ilus pirn', 30);
SELECT * FROM toode;
SELECT * FROM logi;
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;
--kontrollimiseks kustutame toode tabelis toode
DELETE FROM toode
WHERE toodeId=1;
SELECT * FROM toode;
SELECT * FROM logi;
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;
--kontrollimiseks uuendame toode
SELECT * FROM toode;
UPDATE toode SET toodeNimi='orange melon'
WHERE toodeId=2;
SELECT * FROM toode;
SELECT * FROM logi;
CREATE TABLE categories (
	category_id INT IDENTITY (1, 1) PRIMARY KEY,
	category_name VARCHAR (255) NOT NULL
);
CREATE TABLE brands (
	brand_id INT IDENTITY (1, 1) PRIMARY KEY,
	brand_name VARCHAR (255) NOT NULL
);
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
);
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')
);
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
INSERT INTO categories (category_name) VALUES ('Electronics');
INSERT INTO brands (brand_name) VALUES ('TestBrand');
INSERT INTO products(
    product_name, 
    brand_id, 
    category_id, 
    model_year, 
    list_price
)
VALUES (
    'Test product',
    1,
    1,
    2018,
    599
);
SELECT 
    * 
FROM 
    product_audits;

Aleksandra Semjonova ülesanne:

SQL Server

SQL
CREATE DATABASE Filmid;
USE Filmid
CREATE TABLE Filmid(
filimidID int PRIMARY KEY identity(1,1),
filmNimi varchar(50),
lavastaja varchar(50),
filmiKestus int);
CREATE TABLE logi(
logiID int PRIMARY KEY identity(1,1),
kuupaev datetime,
andmed text,
kasutaja varchar(50));
CREATE TRIGGER insertFilmid
ON Filmid
FOR INSERT
AS
INSERT INTO logi(kuupaev, andmed, kasutaja)
SELECT
GETDATE(),
CONCAT('Lisatud andmed: ', inserted.filmNimi, ', ', inserted.lavastaja, ', ', inserted.filimidID),
USER
FROM inserted;
CREATE TRIGGER deleteFilmid
ON Filmid
FOR DELETE
AS
INSERT INTO logi(kuupaev, andmed, kasutaja)
SELECT
GETDATE(),
CONCAT('Kustutanud andmed: ', deleted.filmNimi, ', ', deleted.lavastaja, ', ', deleted.filimidID),
USER
FROM deleted;
-- produtsent lisamine graafiliselt
GRANT INSERT, DELETE TO produtsent;
GRANT SELECT, INSERT, DELETE ON Filmid TO produtsent;
-- admin testid
INSERT INTO Filmid(filmNimi, lavastaja, filmiKestus)
VALUES ('test', 'test', 1234);
SELECT * FROM Filmid;
SELECT * FROM logi;
DELETE FROM Filmid WHERE filimidID=1;
SELECT * FROM Filmid;
SELECT * FROM logi;
-- kasutaja testid
INSERT INTO Filmid(filmNimi, lavastaja, filmiKestus)
VALUES ('test', 'test', 1234);
SELECT * FROM Filmid;
SELECT * FROM logi;
DELETE FROM Filmid WHERE filimidID=1;
SELECT * FROM Filmid;
SELECT * FROM logi;
-- kasutaja testid
USE Filmid;
INSERT INTO Filmid(filmNimi, lavastaja, filmiKestus)
VALUES ('test', 'test', 1234);
SELECT * FROM Filmid;
SELECT * FROM logi;
DELETE FROM Filmid WHERE filimidID=3;
SELECT * FROM Filmid;
SELECT * FROM logi;

XAMPP

Tabeli loomine

SQL
CREATE TABLE Filmid(
filimidID int PRIMARY KEY AUTO_INCREMENT,
filmNimi varchar(50),
lavastaja varchar(50),
filmiKestus int);
SQL
CREATE TABLE logi(
logiID int PRIMARY KEY AUTO_INCREMENT,
kuupaev datetime,
andmed text,
kasutaja varchar(50));

Triggeri loomine

SQL
INSERT INTO logi(kuupaev, andmed, kasutaja)
SELECT
NOW(),
CONCAT('Lisatud andmed: ', new.filmNimi, ', ', new.lavastaja, ', ', new.filimidID),
USER()
SQL
INSERT INTO logi(kuupaev, andmed, kasutaja)
SELECT
NOW(),
CONCAT('Kustutanud andmed: ', old.filmNimi, ', ', old.lavastaja, ', ', old.filimidID),
USER()

Kasutaja loomine

Kasutaja õigused

Kasutaja testid

SQL
INSERT INTO Filmid(filmNimi, lavastaja, filmiKestus)
VALUES ('test', 'test', 1234);
SELECT * FROM Filmid;
SELECT * FROM logi;
SQL
DELETE FROM Filmid WHERE filimidID=1;
SELECT * FROM Filmid;
SELECT * FROM logi;