Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Възможно ли е окончателно да се определи дали дадена DML команда е била издадена от съхранена процедура?

Използвайте CONTEXT_INFO (Transact-SQL) . В процедурата задайте стойност, за да предупредите тригера да не записва нищо:

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

В тригера проверете CONTEXT_INFO и определете дали трябва да направите нещо:

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

за всеки, който просто прави фалшиво вмъкване/актуализиране/изтриване, той няма да е задал CONTEXT_INFO и тригерът ще запише промяната. Може да ви хареса стойността, която поставяте в CONTEXT_INFO, като името на таблицата или @@SPID и т.н., ако смятате, че измамният код ще се опита да използва и 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. Достъп до TimeZoneInfo от SQL 2005 Server

  2. стартирайте съхранена процедура и върнете стойности от VBA

  3. Неуспешно извикване на отдалечена процедура с sql сървър 2008 R2

  4. Необходим е динамичен Pivot с Row_Number()

  5. SQL за генериране на XML на таблични данни