SQL Trigger не работает - PullRequest
       14

SQL Trigger не работает

0 голосов
/ 28 февраля 2011

Существуют ли условия, при которых триггер не срабатывает?

У нас есть такая ситуация:

У нас есть таблица и есть строки, которые были удалены.Нам нужно знать, кто и / или когда эти строки удаляются.

Мы создаем этот триггер:

ALTER TRIGGER [dbo].[AUDITdel_nit] ON [dbo].[Client]
 FOR DELETE
 AS
 Insert into AUDIT select 'Delete', getdate(), 'Row Deleted', SYSTEM_USER, host_name(),
 (select 'ID Client: ' + convert(varchar(12),Id)  from deleted), 'Client' ,APP_NAME()

Мы сделали несколько тестов: удаление строк с помощью хранимых процедур и удаленные строки появляются внаша таблица AUDIT.

Но вдруг сегодня мы обнаружили удаленную строку, которая не отображается в таблице AUDIT ...

Есть идеи, что может быть не так?

Ответы [ 4 ]

1 голос
/ 28 февраля 2011

Вам нужно сделать так, чтобы он обрабатывал несколько удалений записей, которые он в настоящее время не может сделать. Все триггеры всегда должны быть записаны при условии, что несколько записей будут удалены, вставлены или обновлены.

ALTER TRIGGER [dbo].[AUDITdel_nit] ON [dbo].[Client]  
FOR DELETE  AS  

INSERT INTO AUDIT 
SELECT 'Delete', getdate(), 'Row Deleted', SYSTEM_USER, host_name(),  
         'ID Client: ' + convert(varchar(12),Id) , 'Client' ,APP_NAME() 
FROM DELETED

Массовая вставка также может обходить триггер, и таблица усечения не включает триггеры, поскольку действия не регистрируются, но я думаю, что это не ваша проблема здесь. Операторы openrowset также можно запускать, чтобы игнорировать триггеры. Вы можете найти в вашем коде эту фразу, чтобы узнать, делает ли процесс это: WITH (IGNORE_TRIGGERS). Вы также можете специально отключить и снова включить триггер, но никто на производстве не должен иметь права делать это, кроме dbas. Если у всех есть эти права, вы должны исправить это как можно скорее.

0 голосов
/ 01 марта 2011

Поскольку вы используете триггеры, существует ли вероятность того, что некоторые изменения в таблице клиентов вызваны другими триггерами, а для параметра nested triggers установлено значение 0?Это не настройка по умолчанию, но в этом случае ваш триггер не будет срабатывать.Демонстрация эффекта ниже.Чтобы увидеть, была ли установлена ​​эта опция, просто запустите sp_configure без параметров и найдите строку nested triggers.

sp_configure 'nested triggers','0'
go
reconfigure
go
create table T3 (
    ID int not null
)
go
create table T2 (
    ID int not null
)
go
create trigger T_T2
on T2
for insert
as
    insert into T3(ID) select ID from inserted
go
create table T1 (
    ID int not null
)
go
create trigger T_T1
on T1
for insert
as
    insert into T2(ID) select ID from inserted
go
insert into T1(ID)
select 1
go
select * from T1
select * from T2
select * from T3

Сообщения и результаты:

Configuration option 'nested triggers' changed from 1 to 0. Run the RECONFIGURE statement to install.

(1 row(s) affected)

ID
----
1
(1 row(s) affected)

ID
----
1
(1 row(s) affected)

ID
----
(0 row(s) affected)
0 голосов
/ 28 февраля 2011

Я думаю, что оператор вставки после удаления не работает. Таким образом, вы можете проверить причину сбоя вставки аудита.

Insert into AUDIT select 'Delete', getdate(), 'Row Deleted', SYSTEM_USER, host_name(),
(select 'ID Client: ' + convert(varchar(12),Id)  from deleted), 'Client' ,APP_NAME()
0 голосов
/ 28 февраля 2011

Можете ли вы проверить, не отменен ли ваш триггер?

SELECT * FROM   ALL_OBJECTS WHERE  OBJECT_NAME = 'your_trigger' AND OBJECT_TYPE = 'TRIGGER' AND STATUS <> 'VALID'
...