Udostępnij za pośrednictwem


Projektowanie zamiast wyzwalaczy

Główną zaletą zamiast wyzwalaczy to widoki, które nie jest aktualizowalny obsługują aktualizacje.Widok oparty na wielu tabel podstawowych należy użyć wyzwalacza INSTEAD OF do obsługi wstawia aktualizacje i usuwa dane odniesienia w więcej niż jednej tabela.Inną zaletą zamiast wyzwalaczy jest, że te umożliwiają logiki kodu, który można odrzucić części partia, pozwalając na inne części partia powiodła się.

Wyzwalacza INSTEAD OF można wykonać akcje takie jak:

  • Ignorowanie części partia.

  • Przetwarzanie nie część partia i rejestrowania wierszy problem.

  • Podjęcie akcja alternatywne, gdy napotkał błąd.

    Ostrzeżenie

    ZAMIAST usuwania i aktualizacji INSTEAD OF wyzwalacze nie można zdefiniować w tabela klucz obcy, zdefiniowanego za pomocą usuwania lub aktualizacji kaskadowych akcja.

Kodowanie tę logikę jako część wyzwalacza INSTEAD OF uniemożliwia wszystkie aplikacje, które dostęp do danych z konieczności reimplement logikę.

Przykład

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

  • Duplikat wstawia do Person tabela są ignorowane, a informacje Wstaw jest rejestrowane w PersonDuplicates tabela.

  • Wstawia duplikatów do EmployeeTable są włączone do instrukcja UPDATE, która pobiera aktualne informacje w EmployeeTable bez generowania duplikat klucz naruszenie.

Transact-SQL Instrukcje tworzenia dwóch tabel bazowych, widoku, tabela rejestrowanie błędów i INSTEAD OF wyzwalacza w widoku.W poniższych tabelach oddzielenia 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)
   )

Wyświetlanie następujących raportów wszystkie odpowiednie dane z dwóch tabel 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.PersonDuplicates Dzienniki tabela wstawiony wartości nazwy użytkownika, który próbował Wstawianie oraz czas Wstaw.

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

INSTEAD OF Wyzwalacz wstawia wiersze do wielu tabel podstawowych z pojedynczego widoku.Próby wstawienia wierszy z zduplikowane numery ubezpieczenia społecznego są rejestrowane w PersonDuplicates tabela.Zduplikowane wiersze w EmployeeTable są zmieniane na aktualizację sprawozdania.

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

Zobacz także

Koncepcje