Поделиться через


Создание триггеров DML

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

В этой статье описывается создание триггера языка обработки данных Transact-SQL (DML) с помощью SQL Server Management Studio или инструкции Transact-SQL CREATE TRIGGER .

Примеры кода в этой статье используют базу данных образца AdventureWorks2022 или AdventureWorksDW2022, которую можно скачать с домашней страницы образцов и проектов сообщества Microsoft SQL Server и.

Ограничения

Список ограничений и ограничений, связанных с созданием триггеров DML, см. в разделе CREATE TRIGGER.

Разрешения

Требуется ALTER разрешение на таблицу или представление, в котором создается триггер.

Создание триггера DML

Можно использовать один из следующих методов:

Используйте SQL Server Management Studio

  1. В Обозреватель объектов подключитесь к экземпляру СУБД, а затем разверните этот экземпляр.

  2. Разверните базы данных, разверните базу данных, разверните AdventureWorks2022таблицы, а затем разверните таблицу Purchasing.PurchaseOrderHeader.

  3. Правой кнопкой мыши щелкните элемент Триггеры, а затем выберите пункт Создать триггер.

  4. В меню Запрос выберите пункт Задание значений для параметров шаблона. Можно также нажать клавиши CTRL-SHIFT-M, чтобы открыть диалоговое окно Задание значений для параметров шаблона .

  5. В диалоговом окне Задание значений для параметров шаблона введите для показанных параметров следующие значения.

    Параметр Значение
    Author Ваше имя
    Дата создания Сегодняшняя дата
    Описание Проверяет кредитоспособность поставщика, прежде чем позволить вставить новый заказ на покупку от этого поставщика.
    Schema_Name Purchasing
    Trigger_Name NewPODetail2
    Table_Name PurchaseOrderDetail
    Data_Modification_Statement Удалите UPDATE и DELETE из списка.
  6. Нажмите ОК.

  7. В редакторе запросовзамените комментарий -- Insert statements for trigger here следующей инструкцией:

    IF @@ROWCOUNT = 1
    BEGIN
        UPDATE Purchasing.PurchaseOrderHeader
        SET SubTotal = SubTotal + LineTotal
        FROM inserted
        WHERE PurchaseOrderHeader.PurchaseOrderID = inserted.PurchaseOrderID;
    END
    ELSE
    BEGIN
        UPDATE Purchasing.PurchaseOrderHeader
        SET SubTotal = SubTotal + (SELECT SUM(LineTotal)
            FROM inserted
            WHERE PurchaseOrderHeader.PurchaseOrderID = inserted.PurchaseOrderID)
        WHERE PurchaseOrderHeader.PurchaseOrderID IN (SELECT PurchaseOrderID
        FROM inserted);
    END;
    
  8. Чтобы убедиться, что синтаксис действителен, в меню "Запрос " выберите "Анализ". Если возвращается сообщение об ошибке, сравните инструкцию с предыдущим блоком кода, исправьте по мере необходимости и повторите этот шаг.

  9. Чтобы создать триггер DML, в меню "Запрос " выберите "Выполнить". Триггер DML создается как объект в базе данных.

  10. Чтобы увидеть этот триггер DML в обозревателе объектов, щелкните правой кнопкой мыши элемент Триггеры и выберите пункт Обновить.

Использование Transact-SQL

  1. В Обозреватель объектов подключитесь к экземпляру СУБД, а затем разверните этот экземпляр.

  2. В меню "Файл" выберите "Создать запрос".

  3. Скопируйте приведенный ниже пример в окно запроса и нажмите кнопку Выполнить. В этом примере создается тот же сохраненный триггер DML, что и раньше. Триггер действителен для вставки нескольких и отдельных строк и оптимально подходит для вставки одной строки.

    USE AdventureWorks2022;
    GO
    
    CREATE TRIGGER NewPODetail3
    ON Purchasing.PurchaseOrderDetail
    FOR INSERT AS
    IF @@ROWCOUNT = 1
    BEGIN
        UPDATE Purchasing.PurchaseOrderHeader
        SET SubTotal = SubTotal + LineTotal
        FROM inserted
        WHERE PurchaseOrderHeader.PurchaseOrderID = inserted.PurchaseOrderID;
    END
    ELSE
    BEGIN
        UPDATE Purchasing.PurchaseOrderHeader
        SET SubTotal = SubTotal + (SELECT SUM(LineTotal)
            FROM inserted
            WHERE PurchaseOrderHeader.PurchaseOrderID = inserted.PurchaseOrderID)
        WHERE PurchaseOrderHeader.PurchaseOrderID IN (SELECT PurchaseOrderID
        FROM inserted);
    END;