Sql-Server
SQL SERVER 審計單列的 SELECT
這可能嗎,還是表級訪問是最細粒度的?
到目前為止,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、表名和 *. 那可能會做到。
如果我沒有足夠強調它,請在生產中實施之前徹底測試它。