Use CONTEXT_INFO (Transact-SQL) . No procedimento defina um valor para alertar o gatilho para não gravar nada:
--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
No gatilho verifique CONTEXT_INFO e determine se você precisa fazer alguma coisa:
--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
para qualquer um que esteja apenas fazendo uma inserção/atualização/exclusão não autorizada, eles não definirão o CONTEXT_INFO e o gatilho registrará a alteração. Você pode ficar chique com o valor que você coloca em CONTEXT_INFO, como o nome da tabela ou @@SPID, etc. se você acha que o código não autorizado tentará usar CONTEXT_INFO também.