8

我正在处理一些敏感的会计表,我想审计SELECT在表上执行的任何语句或与它们关联的任何视图。

我没有在 BOL(在线图书)上找到任何与声明有关的DDL 事件。SELECT并且 DML 触发器仅用于INSERTUPDATE并且DELETE仅用于。

是否可以通过SELECT语句记录谁访问表和视图?

4

6 回答 6

10

是的,可以通过在AUDIT_DATABASE_OBJECT_ACCESS_EVENT事件上创建事件通知来实现。不过,做这样的事情的成本将是巨大的。

最好使用审计基础架构,或者按照 gbn 的建议使用自定义访问包装器。

于 2009-10-04T18:47:40.497 回答
9

您有 3 个选项:

  • 如果要记录(并删除表权限),则允许通过存储过程进行访问
  • 如果您想限制并保持“直接”访问,请将表格隐藏在视图后面
  • 运行永久跟踪

我会选择选项 1 或 2,因为它们是您的应用程序的一部分并且是自包含的。

虽然,这听起来有点晚开始记录:对表的访问应该事先受到限制。

此外,如果最终用户不直接更正(例如通过 Web 服务器或服务帐户),任何解决方案都会失败。除非您使用存储过程发送最终用户名...

查看示例:

CREATE VIEW dbo.MyTableMask
AS
SELECT *
FROM
    MyTable
    CROSS JOIN
    (SELECT 1 FROM SecurityList WHERE name = SUSER_SNAME())
--WHERE could use NOT EXISTS too with table
GO
于 2009-10-04T07:12:11.850 回答
2
    --In the master database create a server audit
USE master
GO
CREATE SERVER AUDIT [Audit_Select_HumanResources_Employee]
TO FILE
(     FILEPATH = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup'
      ,MAXSIZE = 0 MB
      ,MAX_ROLLOVER_FILES = 2147483647
      ,RESERVE_DISK_SPACE = OFF)
WITH
(QUEUE_DELAY = 1000, state=  on)

ALTER SERVER AUDIT Audit_Select_HumanResources_Employee 
WITH (STATE = ON) ;
GO
--In the database to monitor create a database audit
USE [AdventureWorks2012]
go

CREATE DATABASE AUDIT SPECIFICATION [Database-Audit]
FOR SERVER AUDIT [Audit_Select_HumanResources_Employee]
--In this example, we are monitoring the humanResources.employee
ADD (SELECT ON OBJECT::[HumanResources].[Employee] BY [dbo])
with (state=on)

--Now you can see the activity in the audit file created
SELECT * FROM sys.fn_get_audit_file ('c:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\Audit_Select_HumanResources_Employee.sqlaudit',default,default);
GO

我刚刚为您添加了一些代码。该代码创建了一个服务器审计、一个用于选择活动的数据库审计,最后使用 sys.fn_get_audit_file 从文件中检索信息。您必须为每个表单独执行此操作。如果您想要更自动化的查询,您可以使用其他工具,例如 Apex SQL Audit 或您喜欢的其他第三方工具。

于 2015-01-29T22:51:52.383 回答
1

编辑:使用 SQL Server Profiler 查看和分析跟踪

于 2009-10-04T04:42:17.037 回答
1

SQL Server 2008 Auditing或许能够捕捉到它。除此之外,Profiler/Tracing 是 SQL Server 中唯一可以做到的。

于 2009-10-04T05:03:27.930 回答
0
创建过程 sp_Product_Select @User_Name VarChar(128), @ID Int AS
插入 My_Trace_Table(Table_Name、User_Name、Table_ID、Select_DateTime)
值(“产品”、@User_Name、@ID、GetDate())

选择 *
来自产品
其中 ID = @ID
返回
去
于 2015-08-14T20:27:34.550 回答