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


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

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

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

Перед началом

Ограничения

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

Разрешения

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

Как создать триггер DML

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

Использование среды SQL Server Management Studio

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

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

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

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

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

    Параметр Значение
    Автор Ваше имя
    Create Date Сегодняшняя дата
    Description Проверяет кредитоспособность поставщика, прежде чем позволить вставить новый заказ на покупку от этого поставщика.
    Имя_схемы Покупки
    Имя_триггера NewPODetail2
    Имя_таблицы PurchaseOrderDetail
    Команда_изменения_данных Удаление инструкций UPDATE и DELETE из списка.
  6. Щелкните OK.

  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, как показано выше.

    -- Trigger valid for multirow and single row inserts  
    -- and optimal for single row inserts.  
    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;