我正在处理一些敏感的会计表,我想审计SELECT
在表上执行的任何语句或与它们关联的任何视图。
我没有在 BOL(在线图书)上找到任何与声明有关的DDL 事件。SELECT
并且 DML 触发器仅用于INSERT
,UPDATE
并且DELETE
仅用于。
是否可以通过SELECT
语句记录谁访问表和视图?
我正在处理一些敏感的会计表,我想审计SELECT
在表上执行的任何语句或与它们关联的任何视图。
我没有在 BOL(在线图书)上找到任何与声明有关的DDL 事件。SELECT
并且 DML 触发器仅用于INSERT
,UPDATE
并且DELETE
仅用于。
是否可以通过SELECT
语句记录谁访问表和视图?
是的,可以通过在AUDIT_DATABASE_OBJECT_ACCESS_EVENT事件上创建事件通知来实现。不过,做这样的事情的成本将是巨大的。
最好使用审计基础架构,或者按照 gbn 的建议使用自定义访问包装器。
您有 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
--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 或您喜欢的其他第三方工具。
SQL Server 2008 Auditing或许能够捕捉到它。除此之外,Profiler/Tracing 是 SQL Server 中唯一可以做到的。
创建过程 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 返回 去