Альтернативи тригерів

Створення та оптимізація тригерів у SQL Server

Florin Angelescu

Instructor

Тригери vs збережені процедури

Тригери

  • Спрацьовують автоматично за подією
-- Спричинить спрацювання тригера INSERT
INSERT INTO Orders [...];
  • Не підтримують параметри чи транзакції
  • Не можуть повертати значення як результат

Збережені процедури

  • Виконуються лише за явного виклику
-- Виконає збережену процедуру
EXECUTE sp_DailyMaintenance;
  • Приймають вхідні параметри та транзакції
  • Можуть повертати значення як результат
Створення та оптимізація тригерів у SQL Server

Тригери vs збережені процедури

Тригери

Застосування:

  • аудит
  • забезпечення цілісності

Збережені процедури

Застосування:

  • загальні завдання
  • потреби конкретних користувачів
Створення та оптимізація тригерів у SQL Server

Тригери vs обчислювані стовпці

Тригери

  • обчислюють значення стовпців
  • використовують стовпці з інших таблиць для обчислень
  • для обчислень використовують INSERT або UPDATE
    -- Використовується в тілі тригера
    [...]
    UPDATE
    SET TotalAmount = Price * Quantity
    [...]
    

Обчислювані стовпці

  • обчислюють значення стовпців
  • для обчислень використовують стовпці лише з цієї таблиці
  • обчислення задається під час створення таблиці
    -- Визначення стовпця
    [...]
    TotalAmount AS Price * Quantity
    [...]
    
Створення та оптимізація тригерів у SQL Server

Приклад обчислюваного стовпця

CREATE TABLE [SalesWithPrice]
(
    [OrderID] INT IDENTITY(1,1),
    [Customer] NVARCHAR(50),
    [Product] NVARCHAR(50),
    [Price] DECIMAL(10,2),
    [Currency] NVARCHAR(3),
    [Quantity] INT,
    [OrderDate] DATE DEFAULT (GETDATE()),
    [TotalAmount] AS [Quantity] * [Price]
);
Створення та оптимізація тригерів у SQL Server

Використання тригера як обчислюваного стовпця

CREATE TRIGGER [SalesCalculateTotalAmount]
ON [SalesWithoutPrice]
AFTER INSERT
AS
    UPDATE [sp]
    SET [sp].[TotalAmount] = [sp].[Quantity] * [p].[Price]
    FROM [SalesWithoutPrice] AS [sp]
    INNER JOIN [Products] AS [p] ON [sp].Product = [p].[Product]
    WHERE [sp].[TotalAmount] IS NULL;
Створення та оптимізація тригерів у SQL Server

Порівняймо їх на практиці!

Створення та оптимізація тригерів у SQL Server

Preparing Video For Download...