Udostępnij za pomocą


Tworzenie wyzwalaczy DML

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

W tym artykule opisano sposób tworzenia wyzwalacza języka Transact-SQL Data Manipulation Language (DML) za pomocą programu SQL Server Management Studio lub instrukcji Transact-SQL CREATE TRIGGER .

Przykłady kodu w tym artykule korzystają z przykładowej bazy danych AdventureWorks2025 lub AdventureWorksDW2025, którą można pobrać ze strony głównej Przykładów programu Microsoft SQL Server i projektów społeczności.

Ograniczenia

Aby uzyskać listę ograniczeń i ograniczeń związanych z tworzeniem wyzwalaczy DML, zobacz TWORZENIE WYZWALACZA.

Uprawnienia

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

Jak utworzyć wyzwalacz DML

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

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ń węzeł Bazy danych, rozwiń AdventureWorks2025 bazę danych, rozwiń węzeł Tabele, a następnie rozwiń tabelę Purchasing.PurchaseOrderHeader.

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

  4. W menu zapytania wybierz 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 Purchasing
    Trigger_Name NewPODetail2
    Table_Name PurchaseOrderDetail
    Data_Modification_Statement Usuń UPDATE element 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 Zapytanie wybierz pozycję Przeanalizuj. Jeśli zostanie zwrócony komunikat o błędzie, porównaj instrukcję z poprzednim blokiem kodu, popraw je zgodnie z potrzebami i powtórz ten krok.

  9. Aby utworzyć wyzwalacz DML, z menu Zapytanie wybierz 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ż.

Korzystanie z Transact-SQL

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

  2. W menu Plik wybierz pozycję Nowe zapytanie.

  3. Skopiuj i wklej poniższy przykład w oknie zapytania, a następnie wybierz pozycję Wykonaj. W tym przykładzie tworzony jest ten sam przechowywany wyzwalacz DML, jak poprzednio. Wyzwalacz jest prawidłowy dla wstawiania wielu wierszy i pojedynczych wierszy oraz optymalne dla wstawiania pojedynczych wierszy.

    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;