Sql-Server

SQL SERVER 審計單列的 SELECT

  • June 9, 2020

這可能嗎,還是表級訪問是最細粒度的?

到目前為止,Google搜尋沒有顯示任何內容,這個截圖沒有提到列,但我想我會在這裡問。

SQL Server 版本是 2012 SP4-OD。

在此處輸入圖像描述

不了解您的系統或它們的負載,我不能強調需要非常徹底地測試這個建議的解決方案。但是,也就是說,您可以部分地通過擴展事件來做到這一點。這是一個範例腳本:

   CREATE EVENT SESSION [ColumnAudit]
ON SERVER
   ADD EVENT sqlserver.sp_statement_completed
   (WHERE (
              [sqlserver].[equal_i_sql_unicode_string]([sqlserver].[database_name], N'HamShackRadio')
              AND [sqlserver].[like_i_sql_unicode_string]([statement], N'%RadioName%')
              AND [sqlserver].[like_i_sql_unicode_string]([statement], N'%SELECT%')
          )
   ),
   ADD EVENT sqlserver.sql_statement_completed
   (WHERE (
              [sqlserver].[equal_i_sql_unicode_string]([sqlserver].[database_name], N'HamShackRadio')
              AND [sqlserver].[like_i_sql_unicode_string]([statement], N'%RadioName%')
              AND [sqlserver].[like_i_sql_unicode_string]([statement], N'%SELECT%')
          )
   );

對此有幾點說明。

首先,我強烈建議您進行良好的過濾。我首先過濾了數據庫名稱,以便僅從一個數據庫中擷取它。其次,我確保我可以在其他任何事情之前過濾列名的語句,以確保我只查看那些語句。然後我在 SELECT 上進行過濾。

其次,為了避免使用擴展事件,請記住 Audit 只是在幕後使用它們,因此這是對所提供功能的正常使用。

第三,也是最重要的,測試這個。我不知道像這樣的萬用字元過濾器在您的系統上可能會如何表現。如果您有另一種方法可以在萬用字元之前添加其他過濾器,比如在 object_id 或其他東西上,我會的。

最後,如果有人鍵入 SELECT * FROM dbo.MyTable,這將不起作用。我不確定我將如何處理試圖捕捉它。我猜你可以過濾 SELECT、表名和 *. 那可能會做到。

如果我沒有足夠強調它,請在生產中實施之前徹底測試它。

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