Sql-Server

監控插入表的源 SQL 程式碼

  • May 1, 2019

我有一個不應該存在行的表,這意味著根據業務邏輯數據是錯誤的。並且“壞”行的插入語句來自很多可能的來源。我無法重現這一點,它只是不時發生。而且我想知道哪個確切的 SQL 語句和模組(例如過程/觸發器/臨時語句)是該插入的來源。抓到罪魁禍首。

使用 Profiler 或擴展事件不是方法 - 因為您看不到數據(只是語句),雖然我無法重現這一點,但我無法將輸出與數據相關聯。

在觸發插入後,我嘗試從我內部的**sys.dm_exec_input_buffer(@@SPID,0)**收集資訊(用於記錄目的,收集該表中的每個插入)。但這太寬泛了。它只給出初始 SQL 語句,比如說外部儲存過程,但是可以在某些嵌套儲存過程或觸發器中呼叫插入語句。

我試圖**收集 sys.dm_exec_connections CROSS APPLY sys.dm_exec_sql_text(most_recent_sql_handle)**的輸出- 請參閱下面的整個程式碼。但這相反太窄了——它給了我觸發後收集的聲明。

有沒有辦法捕捉到類似的東西?

SELECT 
OuterSQL = CAST(T.text as NVARCHAR(255))
,InnerSQL = CAST((SUBSTRING(t.text,(s.statement_start_offset/2) + 1, 
         (CASE
            WHEN s.statement_end_offset = -1 
              THEN DATALENGTH(t.text)
            ELSE s.statement_end_offset
          END - s.statement_start_offset)/2 + 1)) as NVARCHAR(255))
FROM sys.dm_exec_connections
   CROSS APPLY sys.dm_exec_sql_text(most_recent_sql_handle) T
   INNER JOIN sys.dm_exec_query_stats s ON sys.dm_exec_connections.most_recent_sql_handle = s.sql_handle
WHERE session_id = @@SPID;

您沒有包含版本或版本資訊,因此如果您執行的是 SQL Server 2016 SP1 或更高版本(或早期版本的企業版),請嘗試使用 SQL Server 審核來跟踪此資訊。

您可以設置數據庫級審計以擷取對該表的 INSERT 操作,然後查詢審計文件以辨識呼叫應用程序和語句。

SQL 審計:https ://docs.microsoft.com/en-us/sql/relational-databases/security/auditing/sql-server-audit-database-engine?view=sql-server-2017

審核操作組:https ://docs.microsoft.com/en-us/sql/relational-databases/security/auditing/sql-server-audit-action-groups-and-actions?view=sql-server-2017

此外,Profiler 和擴展事件應該能夠為您擷取此資訊。您正在擷取哪些跟踪事件?

如果您使用模板 TSQL_Replay 跟踪並對其進行適當過濾,您應該能夠看到呼叫程式碼,包括傳遞給儲存過程或 INSERT 語句的顯式值。

我不太確定壞行是什麼意思,它是來自外部來源的垃圾數據還是來自內部蓄意嘗試的垃圾數據。無論如何,我認為您需要小心授予對數據庫使用者的訪問權限。大多數使用者應該只有讀訪問權限,這樣他們就不能執行任何 DML 操作,即插入/更新/刪除。對於那些應該執行 DML 操作的使用者,應該通過對儲存過程/函式的執行權限而不是通過對錶的直接寫訪問來執行此操作。

我不確定您的應用程序架構如何,但上面解釋了處理業務邏輯的理想(有效)方式並避免任何錯誤/錯誤數據插入的問題。系統管理員訪問權限僅限於對數據知之甚少的 DBA,他們的工作更多是在管理方面。

如上所述,如果它的外部方然後讓網路管理員檢查你的防火牆,以防它是內部的 - 檢查訪問。如果這是來自合法應用程序,那麼請與應用程序團隊一起提出這個問題,並在應用程序層進行業務驗證,而不是在插入數據庫後查找數據源。

這裡要注意的另一件事 - 如果不良數據來自任何使用者對象,即過程/觸發器/函式,這意味著它們需要增強並且業務邏輯需要到位以在數據未更新/插入時出錯與業務邏輯。

我希望上面有幫助。

引用自:https://dba.stackexchange.com/questions/217686