Как определить тип операции (вставка, обновление, удаление) в триггере SQL Server

Мы используем следующий триггер в SQL Server 9X_sql-select для ведения истории, теперь мне нужно идентифицировать 9X_sql-triggers операции, такие как вставка, обновление 9X_trigger или удаление. Я нашел некоторую информацию 9X_sqlselect HERE, но она не работает с SQL Server.

CREATE TRIGGER audit_guest_details ON [PMS].[GSDTLTBL] FOR INSERT,UPDATE,DELETE AS DECLARE @SRLNUB1 INT; DECLARE @UPDFLG1 DECIMAL(3,0); SELECT @SRLNUB1 = I.SRLNUB FROM inserted I; SELECT @UPDFLG1 = I.UPDFLG FROM inserted I; BEGIN /* Here I need to identify the operation and insert the operation type in the GUEST_ADT 3rd field */ insert into dbo.GUEST_ADT values(@SRLNUB1,@UPDFLG1,?); PRINT 'BEFORE INSERT trigger fired.' END; GO 

Но здесь 9X_sql-select мне нужно идентифицировать операцию и я 9X_sql-server хочу вставить соответствующий тип операции.

Здесь 9X_sql-srever я не хочу создавать три триггера для каждой 9X_sql-server операции

9
1

  • Ваш триггер имеет ** ГЛАВНЫЙ ** недостаток, заключающийся в том, что вы, кажется, предполагаете, что он будет вызываться ** один раз для каждой строки ** - это ** не ** случай. Триггер срабатывает ** один раз для каждого оператора **, ...
2
Общее количество ответов: 2

Ответ #1

Ответ на вопрос: Как определить тип операции (вставка, обновление, удаление) в триггере SQL Server

Для вставленного: строки только вставляются. Для 9X_sql-triggers обновления: строки вставляются и удаляются. Для 9X_sql-statement удаленных: строки находятся только в удаленных.

DECLARE @event_type varchar(42) IF EXISTS(SELECT * FROM inserted) IF EXISTS(SELECT * FROM deleted) SELECT @event_type = 'update' ELSE SELECT @event_type = 'insert' ELSE IF EXISTS(SELECT * FROM deleted) SELECT @event_type = 'delete' ELSE --no rows affected - cannot determine event SELECT @event_type = 'unknown' 

15
1

  • ты должен что-то делать сам<p><span class=" ...

Ответ #2

Ответ на вопрос: Как определить тип операции (вставка, обновление, удаление) в триггере SQL Server

Это упрощенная версия ответа Михаила, в 9X_sql-statement которой используется searched CASE expression.

DECLARE @Operation varchar(7) = CASE WHEN EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted) THEN 'Update' WHEN EXISTS(SELECT * FROM inserted) THEN 'Insert' WHEN EXISTS(SELECT * FROM deleted) THEN 'Delete' ELSE NULL --Unknown END; 

3
0