Udostępnij za pośrednictwem


Za pomocą tabel wstawionych i usuniętych

wyzwalacz DMLinstrukcje używać dwóch specjalnych tabel: the deleted table and the inserted tables.SQL Server automatically creates and manages these tables.Te tabele tymczasowe, rezydentny umożliwia badanie skutków pewnych modyfikacji danych i zestaw warunki LŚD wyzwalać akcje.Nie można bezpośrednio zmodyfikować dane w tabelach lub wykonywania operacji języka (DDL) definicja danych na tabele, takich jak tworzenie INDEKSU.

W DML wyzwalaczy, inserted i deleted tabele są używane przede wszystkim do wykonywania następujących czynności:

  • Rozszerzenie więzy integralność między tabelami.

  • Wstawianie lub aktualizowania danych w tabelach podstawowych będącej podstawą widoku.

  • Testowanie błędów i akcja oparte na błąd.

  • Znajdź różnicy między Państwo tabela przed i po modyfikacji danych i podjęcia działań opartych na tę różnicę.

deleted tabela są przechowywane kopie dotyczy wierszy podczas usuwania i aktualizacji instrukcji.Podczas wykonywania instrukcja DELETE lub UPDATE wiersze są usuwane z tabela wyzwalacz i przeniesione do deleted tabela. deletedtabela i wyzwalacz tabela zwykle mają wspólne żadne wiersze.

inserted tabela są przechowywane kopie dotyczy wierszy podczas instrukcji INSERT i UPDATE.Podczas transakcji insert lub update nowe wiersze są dodawane do obu inserted tabela i tabela wyzwalacza.Wiersze w inserted tabela są kopiami nowych wierszy w tabela wyzwalacza.

Transakcja aktualizacji jest podobna do operacji usuwania następuje operacji wstawiania; stare wiersze są kopiowane do deleted tabela, a następnie nowe wiersze są kopiowane z tabela wyzwalacz oraz inserted tabela.

zestaw warunki wyzwalacza inserted i deleted tabel odpowiednio dla akcja, które opalane wyzwalacza.Chociaż odwołującego się do deleted tabela podczas testowania instrukcji INSERT lub inserted tabela podczas testowania usunięcia nie powodowały jakichkolwiek błędów, Testuj tabele te wyzwalacz nie zawierają żadnych wierszy w tych przypadkach.

Ostrzeżenie

Jeżeli akcje wyzwalacza zależą od liczby wierszy skutków modyfikacji danych, należy użyć badania (np. badanie @@ ROWCOUNT) modyfikacji multirow danych (INSERT, DELETE lub UPDATE na podstawie instrukcja SELECT) i podjęcia właściwych działań.

SQL Server 2008nie zezwala na text, ntext, lub image kolumna odwołuje się w inserted i deleted tabel po wyzwalaczy.Jednak te typy danych są uwzględniane wyłącznie do celów zgodności z poprzednimi wersjami.Preferowany przechowywania dużych danych jest użycie varchar(max), nvarchar(max), i varbinary(max) typów danych.Po i zamiast z wyzwala obsługi varchar(max), nvarchar(max), i varbinary(max) danych w inserted i deleted tabele.Aby uzyskać więcej informacji, zobacz CREATE TRIGGER (Transact-SQL).

Przykład z użycie tabeli wstawionej w wyzwalacz wymuszać reguł biznesowych

Ponieważ ograniczeń CHECK można odwołać tylko kolumna, w której kolumna -poziom lub tabela -poziom określone ograniczenie, ograniczenia tabela (w tym przypadek reguły biznesowe) musi być zdefiniowany jako wyzwalaczy.

Poniższy przykład tworzy wyzwalacz DML.Ten wyzwalacz sprawdza, upewnij się, że poziom kredytu dostawcy jest dobry, podczas próby wstawienia nowego zamówienia zakupu do PurchaseOrderHeader tabela.Aby otrzymać kredyt dostawcy, odpowiadające zamówienia zakupu, który właśnie został wstawiony, Vendor musi być odwołuje się do tabela i połączone z inserted tabela.Jeśli jest zbyt niski poziom kredytu, wyświetlany jest komunikat i wstawiania nie wykonać.

Ostrzeżenie

Aby obejrzeć przykłady DML po wyzwalacze, które aktualizują wiele wierszy, zobacz MultiRow zagadnienia dotyczące DML wyzwalaczy.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('Purchasing.LowCredit','TR') IS NOT NULL
   DROP TRIGGER Purchasing.LowCredit;
GO
-- This trigger prevents a row from being inserted in the Purchasing.PurchaseOrderHeader table
-- when the credit rating of the specified vendor is set to 5 (below average).

CREATE TRIGGER Purchasing.LowCredit ON Purchasing.PurchaseOrderHeader
AFTER INSERT
AS
DECLARE @creditrating tinyint, @vendorid int;
IF EXISTS (SELECT *
           FROM Purchasing.PurchaseOrderHeader p 
           JOIN inserted AS i 
           ON p.PurchaseOrderID = i.PurchaseOrderID 
           JOIN Purchasing.Vendor AS v 
           ON v.BusinessEntityID = p.VendorID
           WHERE v.CreditRating = 5
          )
BEGIN
RAISERROR ('This vendor''s credit rating is too low to accept new purchase orders.', 16, 1);
ROLLBACK TRANSACTION;
RETURN 
END;

GO
-- This statement attempts to insert a row into the PurchaseOrderHeader table
-- for a vendor that has a below average credit rating.
-- The AFTER INSERT trigger is fired and the INSERT transaction is rolled back.

INSERT INTO Purchasing.PurchaseOrderHeader (RevisionNumber, Status, EmployeeID,
VendorID, ShipMethodID, OrderDate, ShipDate, SubTotal, TaxAmt, Freight)
VALUES(
2
,3
,261    
,1652   
,4  
,GETDATE()
,GETDATE()
,44594.55   
,3567.564   
,1114.8638);
GO

Za pomocą tabel wstawionych i usuniętych w wyzwalaczy INSTEAD OF

inserted i deleted tabel przekazane zamiast wyzwalaczy zdefiniowany w tabelach wykonaj te same reguły, inserted i deleted tabel przekazane po wyzwalaczy.Format inserted i deleted tabel jest taki sam jak format tabela zdefiniowano wyzwalacza INSTEAD OF.Każda kolumna w inserted i deleted mapy bezpośrednio do kolumny tabel tabela bazowa.

Następujące zasady dotyczące podczas odwoływania się do tabela z wyzwalacza INSTEAD OF instrukcja INSERT lub UPDATE należy podać wartości dla kolumn są takie same, jak gdyby nie miał wyzwalacza INSTEAD OF tabela:

  • Nie można określić wartości dla obliczane kolumny lub kolumn z timestamp typu danych.

  • Nie można określić wartości dla kolumn przy użyciu tożsamości, właściwość, chyba że IDENTITY_INSERT jest włączone dla tej tabela.Gdy IDENTITY_INSERT jest włączone, instrukcji INSERT, należy podać wartość.

  • Instrukcji INSERT, musisz podać wartości dla wszystkich NOT NULL kolumn, które nie mają ograniczenia DOMYOLNE.

  • Dla każdej kolumny, z wyjątkiem obliczaną, tożsamości lub timestamp kolumny, wartości są opcjonalne dla każdej kolumny, która zezwala na wartości null, lub NOT NULL kolumna ma definicji DOMYŚLNYCH.

Po instrukcja INSERT, UPDATE lub DELETE odwołuje się do widoku, który ma wyzwalacza INSTEAD OF Aparat baz danych wywołania wyzwalacza zamiast wszelkich bezpośrednich akcja przeciwko dowolnej tabela.Wyzwalacz należy użyć informacji prezentowanych w inserted i deleted tabel do budowania instrukcje wymagane do wykonania żądanej akcja w tabeli podstawowej, nawet gdy format informacji w inserted i deleted wbudowana widoku tabel różni się od formatu danych w tabeli podstawowej.

Format inserted i deleted tabel przekazany do wyzwalacza INSTEAD OF zdefiniowane na widok odpowiada liście instrukcja SELECT dla widoku.Na przykład:

USE AdventureWorks2008R2;
GO
CREATE VIEW dbo.EmployeeNames (BusinessEntityID, LName, FName)
AS
SELECT e.BusinessEntityID, p.LastName, p.FirstName
FROM HumanResources.Employee AS e 
JOIN Person.Person AS p
ON e.BusinessEntityID = p.BusinessEntityID;

zestaw wyników Dla tego widoku zawiera trzy kolumny: int kolumna i dwóch nvarchar kolumna. inserted i deleted również mieć tabele przekazany do wyzwalacza INSTEAD OF zdefiniowane w widoku int kolumna o nazwie BusinessEntityID, nvarchar kolumna o nazwie LNamei nvarchar kolumna o nazwie FName.

Lista wyboru widoku może również zawierać wyrażenia, które nie są mapowane bezpośrednio na pojedynczej tabela bazy kolumna.Niektóre wyświetlanie wyrażeń, takich jak stała lub funkcja wywołania, nie może zawierać odwołania kolumn i można go zignorować.Wyrażenia złożone można odwoływać się do wielu kolumn jeszcze inserted i deleted tabele mają tylko jedną wartość dla każdej wstawionego wiersza.Te same zagadnienia zastosowanie do prostych wyrażeń w widoku, jeśli odwołują kolumna obliczana , dla którego złożone wyrażenie.Wyzwalacza INSTEAD OF w widoku muszą obsługiwać te typy wyrażeń.Aby uzyskać więcej informacji, zobacz Wyrażenia i kolumny obliczane w zamiast wyzwalaczy.

Zobacz także

Koncepcje