Използвайте CONTEXT_INFO (Transact-SQL) . В процедурата задайте стойност, за да предупредите тригера да не записва нищо:
--in the procedure doing the insert/update/delete
DECLARE @CONTEXT_INFO varbinary(128)
SET @CONTEXT_INFO =cast('SkipTrigger=Y'+REPLICATE(' ',128) as varbinary(128))
SET CONTEXT_INFO @CONTEXT_INFO
--do insert/update/delete that will fire the trigger
SET CONTEXT_INFO 0x0
В тригера проверете CONTEXT_INFO и определете дали трябва да направите нещо:
--here is the portion of the trigger to retrieve the value:
IF CAST(CONTEXT_INFO() AS VARCHAR(128))='SkipTrigger=Y'
BEGIN
--log your data here
END
за всеки, който просто прави фалшиво вмъкване/актуализиране/изтриване, той няма да е задал CONTEXT_INFO и тригерът ще запише промяната. Може да ви хареса стойността, която поставяте в CONTEXT_INFO, като името на таблицата или @@SPID и т.н., ако смятате, че измамният код ще се опита да използва и CONTEXT_INFO.