Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Czy można ostatecznie określić, czy polecenie DML zostało wydane z procedury składowanej?

Użyj CONTEXT_INFO (Transact-SQL) . W procedurze ustaw wartość ostrzegającą wyzwalacz, aby niczego nie rejestrował:

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

W wyzwalaczu sprawdź CONTEXT_INFO i określ, czy musisz coś zrobić:

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

dla każdego, kto po prostu robi nieuczciwe wstawianie/aktualizację/usuwanie, nie ustawi on CONTEXT_INFO, a wyzwalacz zarejestruje zmianę. Możesz zainteresować się wartością, którą umieścisz w CONTEXT_INFO, taką jak nazwa tabeli lub @@SPID itp., jeśli uważasz, że nieuczciwy kod będzie próbował również użyć CONTEXT_INFO.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konwertuj wiersze na kolumny w SQL

  2. Jak odwołać się do jednego CTE dwukrotnie?

  3. Wykonywanie różnych podejść do danych opartych na czasie

  4. Ukryte ulepszenia wydajności i zarządzania w SQL Server 2012/2014

  5. SQL Server Geography typ danych najbliższy punkt w linii