Udostępnij za pośrednictwem


Designing INSTEAD OF Triggers

Podstawową zaletą a nie z wyzwalacze to widoki, które mogą nie być możliwa do obsługi aktualizacji.Widok oparty na wielu tabel bazowych do obsługi wstawia aktualizacji, musi być wyzwalacz Z INSTEAD i usuwa dane odwołanie w więcej niż jedną tabela.Inną zaletą a nie z wyzwalacze to można do logiki kodu, która może odrzucić części partia podczas informując innych części wsadowego powiodła się.

Wyzwalacz Z INSTEAD można wykonać akcje takie jak:

  • Ignorowanie części partia.

  • Nie przetwarza część partia i rejestrowania wierszy problem.

  • Przejmowanie alternatywnych akcja w przypadku wystąpienia błędu.

    Uwaga

    ZAMIAST Z DELETE i UPDATE INSTEAD Z wyzwalaczy nie mogą być definiowane w tabela zawierającej klucz obcy, zdefiniowanego za pomocą DELETE lub UPDATE kaskadowych akcja.

Kodowanie tej reguły w ramach wyzwalacz Z INSTEAD uniemożliwia wszystkie aplikacje, które dostępu do danych z konieczności reimplement logiczne.

Przykład

W następującej sekwencji Transact-SQL instrukcje, INSTEAD OF wyzwalacz aktualizuje dwóch tabel podstawowych z widoku. Ponadto są wyświetlane następujące sposoby obsługi błędów:

  • Duplikat wstawia do Person Tabela są ignorowane, a w rejestrowane są informacje z insert PersonDuplicates Tabela.

  • Wstawia duplikatów do EmployeeTable są włączone do instrukcja UPDATE, które pobiera informacje o bieżącej, w EmployeeTable bez generowania zduplikowane naruszenie klucz.

The Transact-SQL statements create two base tables, a view, a tabela to record errors, and the INSTEAD OF trigger on the view. W poniższych tabelach Rozdziel danych osobistych i biznesowych i są tabele bazowe dla widoku.

CREATE TABLE Person
   (
    SSN         char(11) PRIMARY KEY,
    Name        nvarchar(100),
    Address     nvarchar(100),
    Birthdate   datetime
   )

CREATE TABLE EmployeeTable
   (
    EmployeeID       int PRIMARY KEY,
    SSN              char(11) UNIQUE,
    Department       nvarchar(10),
    Salary           money,
    CONSTRAINT FKEmpPer FOREIGN KEY (SSN)
    REFERENCES Person (SSN)
   )

Na poniższej ilustracji raportuje wszystkie odpowiednie dane z dwóch tabel dla danej osoby.

CREATE VIEW Employee AS
SELECT P.SSN as SSN, Name, Address,
       Birthdate, EmployeeID, Department, Salary
FROM Person P, EmployeeTable E
WHERE P.SSN = E.SSN

Można rejestrować próby wstawienia wierszy z zduplikowane numery ubezpieczenia społecznego.The PersonDuplicates tabela logs the inserted values, the name of the user who tried the insert, and the czas of the insert.

CREATE TABLE PersonDuplicates
   (
    SSN           char(11),
    Name          nvarchar(100),
    Address       nvarchar(100),
    Birthdate     datetime,
    InsertSNAME   nchar(100),
    WhenInserted  datetime
   )

The INSTEAD OF trigger inserts rows into multiple base tables from a single view.Rejestrowane są próby wstawienia wierszy z zduplikowane numery ubezpieczenia społecznego w PersonDuplicates Tabela. Zduplikowane wiersze w EmployeeTable są zmieniane na aktualizowanie instrukcji.

CREATE TRIGGER IO_Trig_INS_Employee ON Employee
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON
-- Check for duplicate Person. If there is no duplicate, do an insert.
IF (NOT EXISTS (SELECT P.SSN
      FROM Person P, inserted I
      WHERE P.SSN = I.SSN))
   INSERT INTO Person
      SELECT SSN,Name,Address,Birthdate
      FROM inserted
ELSE
-- Log an attempt to insert duplicate Person row in PersonDuplicates table.
   INSERT INTO PersonDuplicates
      SELECT SSN,Name,Address,Birthdate,SUSER_SNAME(),GETDATE()
      FROM inserted
-- Check for duplicate Employee. If no there is duplicate, do an INSERT.
IF (NOT EXISTS (SELECT E.SSN
      FROM EmployeeTable E, inserted
      WHERE E.SSN = inserted.SSN))
   INSERT INTO EmployeeTable
      SELECT EmployeeID,SSN, Department, Salary
      FROM inserted
ELSE
--If there is a duplicate, change to UPDATE so that there will not
--be a duplicate key violation error.
   UPDATE EmployeeTable
      SET EmployeeID = I.EmployeeID,
          Department = I.Department,
          Salary = I.Salary
   FROM EmployeeTable E, inserted I
   WHERE E.SSN = I.SSN
END

See Also

Concepts