RonJohn Asked: 2020-06-09 14:14:05 +0800 CST2020-06-09 14:14:05 +0800 CST 2020-06-09 14:14:05 +0800 CST SQL SERVER 审计单列的 SELECT 772 这可能吗,还是表级访问是最细粒度的? 到目前为止,谷歌搜索没有显示任何内容,这个截图没有提到列,但我想我会在这里问。 SQL Server 版本是 2012 SP4-OD。 sql-server sql-server-2012 1 个回答 Voted Best Answer Grant Fritchey 2020-06-10T05:01:18+08:002020-06-10T05:01:18+08:00 不了解您的系统或它们的负载,我不能强调需要非常彻底地测试这个建议的解决方案。但是,也就是说,您可以部分地通过扩展事件来做到这一点。这是一个示例脚本: 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、表名和 *. 那可能会做到。 如果我没有足够强调它,请在生产中实施之前彻底测试它。
不了解您的系统或它们的负载,我不能强调需要非常彻底地测试这个建议的解决方案。但是,也就是说,您可以部分地通过扩展事件来做到这一点。这是一个示例脚本:
对此有几点说明。
首先,我强烈建议您进行良好的过滤。我首先过滤了数据库名称,以便仅从一个数据库中捕获它。其次,我确保我可以在其他任何事情之前过滤列名的语句,以确保我只查看那些语句。然后我在 SELECT 上进行过滤。
其次,为了避免使用扩展事件,请记住 Audit 只是在幕后使用它们,因此这是对所提供功能的正常使用。
第三,也是最重要的,测试这个。我不知道像这样的通配符过滤器在您的系统上可能会如何表现。如果您有另一种方法可以在通配符之前添加其他过滤器,比如在 object_id 或其他东西上,我会的。
最后,如果有人键入 SELECT * FROM dbo.MyTable,这将不起作用。我不确定我将如何处理试图捕捉它。我猜你可以过滤 SELECT、表名和 *. 那可能会做到。
如果我没有足够强调它,请在生产中实施之前彻底测试它。