sql >> Base de Datos >  >> RDS >> Sqlserver

¿Es posible identificar definitivamente si se emitió un comando DML desde un procedimiento almacenado?

Use CONTEXT_INFO (Transact-SQL) . En el procedimiento, establezca un valor para alertar al disparador para que no registre 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 

En el activador, compruebe CONTEXT_INFO y determine si necesita hacer algo:

--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 cualquier persona que simplemente haga una inserción/actualización/eliminación no autorizada, no habrá configurado CONTEXT_INFO y el disparador registrará el cambio. Podría volverse elegante con el valor que pone en CONTEXT_INFO, como el nombre de la tabla o @@SPID, etc. si cree que el código no autorizado también intentará usar CONTEXT_INFO.