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

डीएमएल ट्रिगर से एसक्यूएल स्टेटमेंट

जैसा कि जोनास कहते हैं, प्रोफाइलर आपका सबसे अच्छा विकल्प है (और चयन प्रश्नों के लिए एकमात्र विकल्प)। INSERT, UPDATE, DELETEs के लिए, आप बिना प्रोफाइलर के जो निकटतम प्राप्त कर सकते हैं, वह DBCC INPUTBUFFER(@@SPID) के माध्यम से इनपुट बफर को देखने के लिए हो सकता है। . यह केवल तदर्थ भाषा की घटनाओं के लिए काम करेगा, RPC कॉल के लिए नहीं, और आपको केवल SQL कथन के पहले 256 वर्ण दिखाएगा (संस्करण के आधार पर, मुझे विश्वास है)। कुछ उदाहरण कोड, (dbo के रूप में चलाएँ):

CREATE TABLE TBL (a int, b varchar(50))
go

INSERT INTO TBL SELECT 1,'hello'
INSERT INTO TBL SELECT 2,'goodbye'
go

GRANT SELECT, UPDATE ON TBL TO guest
go

CREATE TABLE AUDIT (    audittime datetime default(getdate())
                    ,   targettable sysname
                    ,   loginname sysname
                    ,   spid int
                    ,   sqltext nvarchar(max))
go

CREATE TRIGGER TR_TBL ON TBL FOR INSERT, UPDATE, DELETE
AS BEGIN
    CREATE TABLE #DBCC (EventType varchar(50), Parameters varchar(50), EventInfo nvarchar(max))

    INSERT INTO #DBCC
    EXEC ('DBCC INPUTBUFFER(@@SPID)')

    INSERT INTO AUDIT (targettable, loginname, spid, sqltext)
        SELECT  targettable =   'TBL'
        ,       suser       =   suser_name()
        ,       spid        =   @@SPID
        ,       sqltext     =   EventInfo 
        FROM #DBCC
END
GO

/* Test the Audit Trigger (can be run as guest) */
UPDATE TBL SET a = 3 WHERE a = 2


  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. SQL सर्वर में फ़ोरैच कैसे लिखें?

  3. SQL सर्वर में उपश्रेणियों का उपयोग कैसे करें पर आसान मार्गदर्शिका

  4. (WHERE) शर्तों के साथ चयनित पंक्तियों से पिछली और अगली पंक्ति प्राप्त करें

  5. क्या मुझे टी-एसक्यूएल में कैच ब्लॉक में रोलबैक एक से पहले लेनदेन की गणना करनी है?