sql >> Databasteknik >  >> RDS >> Sqlserver

Är det möjligt att definitivt identifiera om ett DML-kommando utfärdades från en lagrad procedur?

Använd CONTEXT_INFO (Transact-SQL) . I proceduren ställ in ett värde för att varna utlösaren för att inte spela in något:

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

I triggern kontrollera CONTEXT_INFO och avgör om du behöver göra något:

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

för alla som bara gör en falsk infogning/uppdatering/borttagning kommer de inte att ha ställt in CONTEXT_INFO och utlösaren kommer att registrera ändringen. Du kan bli fancy med värdet du lägger in i CONTEXT_INFO, som tabellnamnet eller @@SPID, etc. om du tror att den falska koden kommer att försöka använda CONTEXT_INFO också.



  1. Mysql 8 fjärråtkomst

  2. Långsamt BESTÄLL AV i stort bord

  3. Hur lagrar jag .txt-filer MySQL-databas?

  4. Är användningen av SELECT COUNT(*) före SELECT INTO långsammare än att använda undantag?