У меня должен быть один триггер, который запускается либо в операциях UPDATE, либо DELETE. У меня триггер работает нормально, когда обновляется один определенный столбец. Однако мне нужна другая логика, когда была запущена операция DELETE. Как бы у меня была логика внутри одного триггера? Вот то, что я до сих пор: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' - почему бы не просто иметь два отдельных триггера, каждый из которых фокусировался на одной операции? –
@marc_s: комментарии, связанные с моим ответом, показали, что логика не была совсем иной. Обе операции записывают данные в ту же таблицу аудита; 'UPDATE' присоединяется к таблицам' INSERTED' и DELETED', а 'DELETE' просто тянет из таблицы' DELETED'. Просто FYI. –