Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

É possível identificar definitivamente se um comando DML foi emitido de um procedimento armazenado?


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.