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