zer*_*law 3 sql-server audit standard-edition
我使用的是 Sql Server 2014 标准版。我的目标是跟踪对表的操作历史(插入、更新、删除),并显示在网络上,以便用户能够知道过去数据发生了什么。
因此,我开始知道 Sql Server 标准版中部分支持审计功能,并且能够记录一些操作,如附件所示。
我的问题是,如何将这些日志存储在适当的 Sql 表中,以便可以在网页上访问、检索和显示这些记录?
目前,允许的审计目标:文件、安全日志、应用程序日志......似乎无法直接从 ASP.NET API 检索。
是否可以登录到 SQL 表?
PS:
(如果我错了,请纠正我)。许多人说标准版只允许服务器级审计,但不允许数据库级审计。但是,由于一些未知的原因,如果我添加了这 7 种审计类型(是的,7 种或无),我就能够捕获和查看数据库级别的操作。
捕获单个表上的 DML 操作是标准版中不可用的审计功能之一。
如果您想跟踪 DML 操作,另一个可能的钩子是扩展事件。您将无法使用审计包,但您可以使用锁定获取事件来捕获读取和写入操作。
我在这里写了博客:https : //spaghettidba.com/2015/04/20/tracking-table-usage-and-identifying-unused-objects/
其他选项是:
我使用以下技术来捕获审核日志并将其存储在表中。也许您可以根据您的需要进行调整。我们实际上使用企业版,因此我们可能能够捕获比标准版更多的内容。
配置您的审计以写入文件系统并将最大大小限制为 10mb 等。当满足该大小时,这将强制创建新的审核文件。我们使用共享文件夹是因为我们有多个服务器写入审核信息,并且我们使用在单独服务器上运行的一个捕获进程。
创建一个存储过程(示例如下),该过程将使用sys.fn_get_audit_file. 创建一个代理作业来定期运行捕获存储过程(我们每分钟运行一次)。
存储过程使用 Powershell 将审核文件从主存储文件夹“移动”到“暂存”文件夹。我们绕过审核进程仍在写入的“锁定”文件,并将在下一个捕获周期中拾取它们。存储过程使用读取审计文件sys.fn_get_audit_file并将信息插入到历史表中。您还可以包含一个WHERE子句来限制从审核文件中选择的信息。然后,我们再次调用 Powershell 来删除“暂存”审核文件。
这是存储过程:
CREATE PROCEDURE [dbo].[SqlAuditCaptureAuditLogs]
AS
BEGIN
SET XACT_ABORT ON
EXEC xp_cmdshell 'powershell.exe "Move-Item \\<SharedFolder>\SQLAuditLogs-SC\*.sqlaudit \\<SharedFolder>\SQLAuditLogs-SC\SQLAuditLogs_Staging -ErrorAction SilentlyContinue"'
,no_output
INSERT INTO SQLAUDIT.[dbo].[SQLAUDIT_HISTORY] (
event_time
,sequence_number
,action_id
,server_principal_name
,server_instance_name
,database_name
,schema_name
,object_name
,statement
)
SELECT event_time
,sequence_number
,action_id
,server_principal_name
,server_instance_name
,database_name
,schema_name
,object_name
,statement
FROM sys.fn_get_audit_file('<SharedFolder\SQLAuditLogs-SC\SQLAuditLogs_Staging\*.*', DEFAULT, DEFAULT)
EXEC xp_cmdshell 'powershell.exe "Remove-Item \\<SharedFolder>\SQLAuditLogs-SC\SQLAuditLogs_Staging\*.* -ErrorAction SilentlyContinue"'
,no_output
END
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7109 次 |
| 最近记录: |