Udostępnij za pośrednictwem


Tworzenie wyzwalaczy DML

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

W tym temacie opisano sposób tworzenia wyzwalacza DML Transact-SQL przy użyciu programu SQL Server Management Studio oraz instrukcji CREATE TRIGGER Transact-SQL.

Przed rozpoczęciem

Ograniczenia i ograniczenia

Aby uzyskać listę ograniczeń i restrykcji związanych z tworzeniem wyzwalaczy DML, zapoznaj się z CREATE TRIGGER (Transact-SQL).

Uprawnienia

Wymaga uprawnienia ALTER w tabeli lub widoku, w którym jest tworzony wyzwalacz.

Jak utworzyć wyzwalacz DML

Możesz użyć jednej z następujących opcji:

Korzystanie z programu SQL Server Management Studio

  1. W Eksploratorze obiektów połącz się z instancją Silnika bazy danych, a następnie rozwiń tę instancję.

  2. Rozwiń Databases, rozwiń bazę danych AdventureWorks2022, rozwiń Tabele, a następnie rozwiń tabelę Purchasing.PurchaseOrderHeader.

  3. Kliknij prawym przyciskiem myszy Wyzwalacze, a następnie wybierz Nowy Wyzwalacz.

  4. Na menu Zapytanie kliknij pozycję Określ Wartości Parametrów Szablonu. Alternatywnie możesz nacisnąć (Ctrl-Shift-M), aby otworzyć okno dialogowe Określanie wartości parametrów szablonu.

  5. W oknie dialogowym Określ wartości parametrów szablonu wprowadź następujące wartości dla wyświetlanych parametrów.

    Parametr Wartość
    Autor Twoja nazwa
    Data utworzenia Dzisiejsza data
    Opis Sprawdza ocenę kredytową dostawcy przed zezwoleniem na wstawienie nowego zamówienia zakupu z dostawcą.
    Schema_Name Zakup
    Nazwa_Wyzwalacza NewPODetail2
    Nazwa_Tabeli Szczegóły Zamówienia Zakupu
    Instrukcja_Modyfikacji_Danych Usuń polecenie UPDATE i DELETE z listy.
  6. Kliknij przycisk OK.

  7. W edytorze zapytań zastąp komentarz -- Insert statements for trigger here następującą instrukcją:

    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. Aby sprawdzić, czy składnia jest prawidłowa, w menu zapytania kliknij pozycję Przeanalizuj. Jeśli zostanie zwrócony komunikat o błędzie, porównaj wyrażenie z powyższymi informacjami, popraw je w miarę potrzeb i powtórz ten krok.

  9. Aby utworzyć wyzwalacz DML, w menu Zapytanie kliknij pozycję Wykonaj. Wyzwalacz DML jest tworzony jako obiekt w bazie danych.

  10. Aby wyświetlić wyzwalacz DML wymieniony w Eksploratorze obiektów, kliknij prawym przyciskiem myszy Wyzwalacze i wybierz pozycję Odśwież.

przed rozpoczęciem

Korzystanie z Transact-SQL

  1. W Eksploratorze obiektówpołącz się z instancją Silnika bazy danych, a następnie rozwiń tę instancję.

  2. W menu plik kliknij pozycję Nowe zapytanie.

  3. Skopiuj i wklej poniższy przykład w oknie zapytania, a następnie kliknij pozycję Wykonaj. W tym przykładzie jest tworzony ten sam przechowywany wyzwalacz DML, co powyżej.

    -- 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;