Триггеры в SQL

Краткое содержание

Триггеры SQL — это мощный инструмент управления базами данных, который позволяет автоматизировать обработку данных, поддерживать их качество и согласованность. Они незаменимы при разработке сложных приложений и систем баз данных, где управление и контроль данных имеют критическое значение.

Триггеры SQL (или просто триггеры) — это объекты базы данных, которые автоматически выполняют определённые действия при возникновении определённых событий в таблице базы данных. Они особенно полезны для обеспечения целостности данных и реализации автоматических операций.


Основные характеристики триггеров SQL:

  1. Автоматическое выполнение:
    Триггеры срабатывают автоматически при наступлении определённого события, например, при добавлении, изменении или удалении данных.
  2. Типы триггеров:
    • BEFORE-триггер: Выполняется перед выполнением операции с данными.
    • AFTER-триггер: Выполняется после выполнения операции с данными.
  3. Цели и использование:
    Триггеры полезны в различных случаях, например:
    • Создание систем журналирования и отслеживания изменений.
    • Проверка и валидация данных перед их сохранением.
    • Автоматическое отправление уведомлений.
  4. Целостность данных:
    Триггеры помогают поддерживать целостность и согласованность данных, реализуя бизнес-логику, которая не всегда может быть учтена только структурой таблиц базы данных.
  5. Централизация бизнес-логики:
    Триггеры позволяют централизовать бизнес-логику, задавая определённые правила и процедуры в одном месте, вместо распределения их по разным приложениям или сервисам.

Итог

Триггеры SQL — это мощный инструмент управления базами данных, позволяющий автоматизировать обработку данных и обеспечивать их качество и согласованность. Они особенно важны при разработке сложных систем и приложений, где критически важно отслеживать и управлять данными.

Триггер — это процесс, который автоматически запускает заданные в нём действия при наступлении определённых условий.

create database trigerTARpv23;
use trigerTARpv23;
--loomine tabel toode
create table toode(
toodeId int primary key identity(1,1),
toodeNimi varchar(50),
hind int);
-- loome tabeli mis täidab triger
CREATE TABLE logi(
id int primary key identity(1,1),
kasutaja varchar(100),
kuupaev datetime,
sisestatudAndmed text);

INSERT TRIGER — triger, mis jälgib(отслеживает) anmdete lisamine tabelisse ja teeb vastava kirje tabelis logi.

INSERT TRIGER — триггер, который отслеживает (отслеживает) добавление данных в таблицу и записывает в журнал соответствующую запись в таблице.

CONCAT складывает предложение.

На добаление

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

На удаление

CREATE TRIGGER toodeKustatumine
ON toode --tabel, mis jälgitakse
FOR DELETE
AS
INSERT INTO logi(kasutaja, kuupaev, sisestatudAndmed)
SELECT
USER, 
GETDATE(),
CONCAT('Kustatud andmed: ', deleted.toodenimi, ',', deleted.hind)
FROM deleted
--kontrollimiseks kustatame 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 DELETE
AS
INSERT INTO logi(kasutaja, kuupaev, sisestatudAndmed)
SELECT
USER, 
GETDATE(),
CONCAT('Kustatud andmed: ', deleted.toodenimi, ',', 
deleted.hind, 'Uued andmed:', inserted.toodenimi, ', ', inserted.hind)
FROM deleted INNER JOIN inserted
ON deleted.toodeId=inserted.toodeId
--kontrollimseks uuendamine toode
SELECT * FROM toode;
UPDATE toode SET toodeNimi='orange melon'
WHERE toodeId=2;
SELECT * FROM toode;
SELECT * FROM logi;

Ülesanne TV_shop

Создаем таблицу TV_Shop и вхрди в нее

CREATE DATABASE TV_Shop;
USE TV_Shop;

Создание таблицы TV_baas

CREATE TABLE TV_baas (
    TV_ID INT PRIMARY KEY IDENTITY(1,1),
    TV_mudel VARCHAR(100) NOT NULL,
    TV_suurus INT NOT NULL
);

Таблица logi

-- таблица logi
CREATE TABLE logi (
    logiID INT PRIMARY KEY IDENTITY(1,1),
    kasutaja VARCHAR(100),
    kuupaev DATETIME DEFAULT GETDATE(),
    sisestatudAndmed TEXT
);

— Триггер INSERT

-- триггер INSERT 
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

-- триггера DELETE
CREATE TRIGGER DeleteTV
ON TV_baas 
FOR DELETE
AS
INSERT INTO logi(kasutaja, kuupaev, sisestatudAndmed)
SELECT
USER, 
GETDATE(),
CONCAT('Kustatud andmed: TV_mudel=', deleted.TV_mudel, ', TV_suurus=', deleted.TV_suurus)
FROM deleted;

— Триггер UPDATE

-- триггер UPDATE 
CREATE TRIGGER UpdateTV
ON TV_baas 
FOR UPDATE
AS
INSERT INTO logi(kasutaja, kuupaev, sisestatudAndmed)
SELECT
USER, 
GETDATE(),
CONCAT('Vana andmed: TV_mudel=', deleted.TV_mudel, ', TV_suurus=', deleted.TV_suurus,
       ' -> Uued andmed: TV_mudel=', inserted.TV_mudel, ', TV_suurus=', inserted.TV_suurus)
FROM deleted
INNER JOIN inserted ON deleted.TV_ID = inserted.TV_ID;
INSERT INTO TV_baas (TV_mudel, TV_suurus)
VALUES (
('za1', '120'),
('za2', '140'),
('za3', '250'),
('za4', '150'),
('za5', '200'));
UPDATE TV_baas SET TV_mudel='za6'
WHERE toodeId=2;
DELETE FROM TV_baas WHERE TV_mudel='Alfreds Futterkiste';

XAMPP

Päästik

INSERT INTO

INSERT INTO logi(kasutaja, kuupaev, sisestatudAndmed)
VALUES(
USER(), 
NOW(),
CONCAT('lisatud andmed ', NEW.toodenimi, ',', NEW.hind))

Kustutamine

INSERT INTO logi(kasutaja, kuupaev, sisestatudAndmed)
VALUES(
USER(), 
OLD(),
CONCAT('lisatud andmed ', OLD.toodenimi, ',', OLD.hind))

Uuendamine

INSERT INTO logi(kasutaja, kuupaev, sisestatudAndmed)
VALUES(
USER(), 
NOW(),
CONCAT('vanad andmed ', OLD.toodenimi, ',', OLD.hind,
       '\n uued andmed', NEW.toodenimi, ',', NEW.hind))

Создание даты базы TV_Shop

CREATE DATABASE TV_Shop;
USE TV_Shop;

Создание таблицы TV_baas

CREATE TABLE TV_baas (
    TV_ID INT PRIMARY KEY AUTO_INCREMENT,
    TV_mudel VARCHAR(100) NOT NULL,
    TV_suurus INT NOT NULL
);