Альтернативы триггерам

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

Florin Angelescu

Instructor

Триггеры и хранимые процедуры

Триггеры

  • Срабатывают автоматически при наступлении события
-- Will fire an INSERT trigger
INSERT INTO Orders [...];
  • Не принимают параметры и не поддерживают транзакции
  • Не возвращают значения

Хранимые процедуры

  • Выполняются только при явном вызове
-- Will run the stored procedure
EXECUTE sp_DailyMaintenance;
  • Принимают входные параметры и поддерживают транзакции
  • Могут возвращать значения
Создание и оптимизация триггеров в SQL Server

Триггеры и хранимые процедуры

Триггеры

Применяются для:

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

Хранимые процедуры

Применяются для:

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

Триггеры и вычисляемые столбцы

Триггеры

  • вычисляют значения столбцов
  • используют столбцы из других таблиц
  • для вычисления применяется INSERT или UPDATE
    -- Used in the trigger body
    [...]
    UPDATE
    SET TotalAmount = Price * Quantity
    [...]
    

Вычисляемые столбцы

  • вычисляют значения столбцов
  • используют столбцы только из той же таблицы
  • вычисление задаётся при создании таблицы
    -- Column definition
    [...]
    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...