我正在处理一些敏感的会计表,我想审核在表格上执行的任何SELECT
语句或与其关联的任何视图。无论如何为“SELECT”语句创建SQL Server DDL触发器?
我在BOL(联机丛书)上找不到与SELECT
声明有关的任何DDL Events。 而DML触发器仅适用于INSERT
,UPDATE
和DELETE
。
是否可以通过SELECT
声明记录谁访问表和视图?
我正在处理一些敏感的会计表,我想审核在表格上执行的任何SELECT
语句或与其关联的任何视图。无论如何为“SELECT”语句创建SQL Server DDL触发器?
我在BOL(联机丛书)上找不到与SELECT
声明有关的任何DDL Events。 而DML触发器仅适用于INSERT
,UPDATE
和DELETE
。
是否可以通过SELECT
声明记录谁访问表和视图?
你有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
SQL Server 2008中审计可以能够捕捉到它。除此之外,Profiler/Tracing是SQL Server中唯一可以实现的功能。
是的,有可能通过在AUDIT_DATABASE_OBJECT_ACCESS_EVENT事件创建Event Notification。尽管如此,做这样的事情的代价是巨大的。
使用audit infrastructure或使用gbn建议的自定义访问包装要好得多。
我还没有听说过事件通知,这听起来很有希望。 – Sung 2009-10-04 21:19:52
我必须再次强调,为数据库中的每个对象访问检查生成一个事件将是非常重量级的。 – 2009-10-04 23:32:12
--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或您偏好的其他第三方工具。
CREATE PROCEDURE sp_Product_Select @User_Name VarChar(128), @ID Int AS INSERT INTO My_Trace_Table (Table_Name, User_Name, Table_ID, Select_DateTime) VALUES ('Products', @User_Name, @ID, GetDate()) SELECT * FROM Products WHERE ID = @ID RETURN GO
这不是一个触发器。 – 2018-01-08 16:41:52
我也一直在寻找到SQL Server 2008的审核,但不幸的是,我现在处理的SQL Server 2005。我想知道是否可以从开发服务器(2008)创建生产服务器(2005)的链接,然后使用审计。 – Sung 2009-10-04 21:15:32
此外,它只是企业。 – Oliver 2013-06-28 19:52:03