sql >> Database teknologi >  >> RDS >> Sqlserver

Er det muligt definitivt at identificere, om en DML-kommando blev udstedt fra en lagret procedure?

Brug CONTEXT_INFO (Transact-SQL) . Indstil en værdi i proceduren for at advare triggeren om ikke at registrere noget:

--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 triggeren skal du kontrollere CONTEXT_INFO og afgøre, om du skal gøre noget:

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

for alle, der bare laver en falsk indsættelse/opdatering/sletning, vil de ikke have indstillet CONTEXT_INFO, og udløseren vil registrere ændringen. Du kan blive fancy med den værdi, du lægger i CONTEXT_INFO, som f.eks. tabelnavnet eller @@SPID osv., hvis du tror, ​​at slyngelkoden også vil forsøge at bruge CONTEXT_INFO.



  1. kan ikke få ud parameter fra lagret procedure ved hjælp af php

  2. Sammensat JSONB-array-forespørgsel i Postgres?

  3. LISTAGG alternativ i Oracle 10g

  4. Vedhæft en database i SQLite