Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

क्या यह निश्चित रूप से पहचानना संभव है कि संग्रहीत प्रक्रिया से डीएमएल कमांड जारी किया गया था या नहीं?

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 का भी उपयोग करने का प्रयास करेगा, तो आप CONTEXT_INFO में डाले गए मान, जैसे तालिका नाम या @@ SPID, आदि के साथ फैंसी प्राप्त कर सकते हैं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डेटाबेस में अद्वितीय बाधाओं और अनुक्रमणिका की सूची प्राप्त करें

  2. विचित्र प्रदर्शन समस्या:इनलाइन उपयोगकर्ता-परिभाषित फ़ंक्शन में सामान्य तालिका अभिव्यक्तियाँ

  3. ANSI_NULLS TSQL में कैसे काम करता है?

  4. इनर जॉइनिंग थ्री टेबल

  5. कई स्तंभों को एक में मिलाएँ, समानता बनाए रखें और अंतरों को बदलें