我必須在UPDATE或DELETE操作中觸發一個觸發器。當某個列更新時,我的觸發器工作正常。但是,我需要不同的邏輯來處理DELETE操作。我如何在一個觸發器中同時具有邏輯?這是我到目前爲止有:通過觀察其magic- /僞表的更新或刪除SQL觸發器
ALTER TRIGGER [dbo].[Audit_Emp_Trigger]
ON [dbo].[EMPLOYEE]
AFTER UPDATE, DELETE
AS
BEGIN
--Only execute the trigger if the Dno field was updated or deleted
IF UPDATE(Dno)
BEGIN
--If the Audit_Emp_Record table does not exist already, we need to create it
IF OBJECT_ID('dbo.Audit_Emp_Record') IS NULL
BEGIN
--Table does not exist in database, so create table
CREATE TABLE Audit_Emp_Record
(
date_of_change smalldatetime,
old_Lname varchar (50),
new_Lname varchar (50),
old_ssn int,
new_ssn int,
old_dno int,
new_dno int
);
--Once table is created, insert the values of the update operation into the table
INSERT INTO Audit_Emp_Record(date_of_change, old_Lname, new_Lname, old_ssn, new_ssn, old_dno, new_dno) SELECT GETDATE(), D.Lname, I.Lname, D.Ssn, I.Ssn, D.Dno, I.Dno FROM inserted I JOIN deleted D ON I.Ssn = D.Ssn
END
ELSE
BEGIN
--The table already exists, so simply insert the new values of the update operation into the table
INSERT INTO Audit_Emp_Record(date_of_change, old_Lname, new_Lname, old_ssn, new_ssn, old_dno, new_dno) SELECT GETDATE(), D.Lname, I.Lname, D.Ssn, I.Ssn, D.Dno, I.Dno FROM inserted I JOIN deleted D ON I.Ssn = D.Ssn
END
END
END
如果邏輯是'UPDATE'和'DELETE'之間如此不同 - 爲什麼不只是有兩個獨立的觸發器,每個專注於自己的一個操作? – 2014-09-22 04:27:08
@marc_s:與我的回答相關的評論顯示,邏輯並沒有完全不同。兩個操作都將數據記錄到同一個審計表; 'UPDATE'加入'INSERTED'和DELETED'表,'DELETE'只是從DELETED表中拉出。只是FYI。 – 2014-09-22 20:02:43