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