sql >> Databáze >  >> RDS >> Sqlserver

Je možné definitivně identifikovat, zda byl příkaz DML vydán z uložené procedury?

Použijte CONTEXT_INFO (Transact-SQL) . V postupu nastavte hodnotu, která upozorní spouštěč, aby nic nezaznamenal:

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

Ve spouštěči zkontrolujte CONTEXT_INFO a určete, zda potřebujete něco udělat:

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

pro každého, kdo pouze provádí nepoctivé vkládání/aktualizaci/mazání, nebude mít nastaveno CONTEXT_INFO a spouštěč zaznamená změnu. Hodnotu, kterou vložíte do CONTEXT_INFO, jako je název tabulky nebo @@SPID atd., by se vám mohla líbit, pokud si myslíte, že se podvodný kód pokusí použít i CONTEXT_INFO.



  1. TypeORM nepodporuje nastavení databáze na dekorátoru entity

  2. update trigger pro aktualizaci záznamů v jiné tabulce

  3. PHP:Třídění výsledků MySQL do vícerozměrného pole

  4. Audit historie více tabulek v databázi