Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Est-il possible d'identifier définitivement si une commande DML a été émise à partir d'une procédure stockée ?

Utilisez CONTEXT_INFO (Transact-SQL) . Dans la procédure, définissez une valeur pour avertir le déclencheur de ne rien enregistrer :

--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 

Dans le déclencheur, vérifiez CONTEXT_INFO et déterminez si vous devez faire quelque chose :

--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

pour quiconque fait juste une insertion/mise à jour/suppression malveillante, il n'aura pas défini le CONTEXT_INFO et le déclencheur enregistrera le changement. Vous pourriez devenir fantaisiste avec la valeur que vous mettez dans CONTEXT_INFO, comme le nom de la table ou @@SPID, etc. si vous pensez que le code malveillant tentera également d'utiliser CONTEXT_INFO.