何时禁用并重新启用表触发器?

Eng*_*SQL 8 trigger sql-server

我需要知道表触发器的启用/禁用历史记录是否由 SQL Server 本地跟踪。

我查看了系统视图:
• [sys].[triggers] 包含一个 modify_date 字段
• [sys].[trigger_events] 关注触发器 INSERT/UPDATE/DELETE 事件

您能否推荐有关触发历史记录的任何其他信息来源?

Aar*_*and 11

SQL Server 不跟踪此信息(我有一半希望在默认跟踪中看到它,但它也不存在)。启用/禁用将更新 modify_date,但您将无法将其与重命名或代码修改区分开来。此外,它只会显示上次更改发生的时间。如果您想要任何其他跟踪(例如是谁做的),您将需要实施审计或跟踪。我想也许也可以使用 DDL 触发器,但这似乎是故意的功能差距:

您可以通过以下方式使用审计捕获此信息:

USE master;
GO

CREATE SERVER AUDIT MyAudit 
  TO FILE (FILEPATH = 'C:\temp\', MAXSIZE = 1 GB) 
  WITH (ON_FAILURE = CONTINUE); 
GO

ALTER SERVER AUDIT MyAudit WITH (STATE = ON); 
GO

USE [your_database];
GO

CREATE DATABASE AUDIT SPECIFICATION schema_db_change 
  FOR SERVER AUDIT MyAudit 
  ADD (SCHEMA_OBJECT_CHANGE_GROUP), 
  ADD (DATABASE_OBJECT_CHANGE_GROUP);

ALTER DATABASE AUDIT SPECIFICATION schema_db_change WITH (STATE = ON); 
GO
Run Code Online (Sandbox Code Playgroud)

现在去禁用你的触发器,然后运行:

SELECT event_time, succeeded, server_principal_name, [object_name], [statement] 
FROM sys.fn_get_audit_file ('C:\Temp\MyAudit*', NULL, NULL);
Run Code Online (Sandbox Code Playgroud)

如果由于版本或其他问题而无法使用审计,则可以使用服务器端跟踪以相对便宜的方式执行此操作。只需捕获SQL:BatchCompleted并选择性地过滤TextData LIKE '%disable%trigger%'(您必须测试在您的场景中支付过滤器的成本是否更好,以避免收集太多,或者只是收集更多并在以后减少它。过滤器可能非常昂贵,但它取决于在系统上。)

我相信还有一种方法可以通过扩展事件来做到这一点。但是 XEvents 和 audit 都需要 2008+ 并且您没有指定版本...

更好的是,删除为绕过更改管理的用户修改触发器的功能。理想情况下,您应该能够在不查看数据库的情况下确定谁启用或禁用了触发器,因为没有人应该在没有记录的情况下这样做。


Iva*_*vic 6

目前,只有 SQL Server Enterprise Edition 和 SQL Server Developer Edition 支持审计功能,以便跟踪触发器的启用和禁用 要捕获这些事件,您需要先创建一个 Server 审计规范——SQL Server Audit 对象收集服务器或数据库——级别动作和动作组:

USE master;
GO
CREATE SERVER AUDIT ServerAudit
TO FILE (FILEPATH = 'c:\audits\', MAXSIZE = 2 GB)
WITH (ON_FAILURE = CONTINUE);
GO
ALTER SERVER AUDIT ServerAudit
WITH (STATE = ON);
Run Code Online (Sandbox Code Playgroud)

下一步是在数据库级别创建数据库审计规范。在我们的案例中,我们需要捕获的审计组是 SCHEMA_OBJECT_CHANGE_GROUP - 没有专门捕获启用/禁用触发事件的审计组

USE [ACMEDB];
GO
CREATE DATABASE AUDIT SPECIFICATION schema_change
FOR SERVER AUDIT ServerAudit
ADD (SCHEMA_OBJECT_CHANGE_GROUP)
WITH (STATE = ON);
GO
Run Code Online (Sandbox Code Playgroud)

查询先前创建的审计,通过使用 LIKE 运算符将捕获的条目范围缩小到与启用/禁用触发器相关的条目:

SELECT
       event_time AS [Time],
       server_principal_name AS [User],
       object_name AS [Object name],
       Statement
  FROM sys.fn_get_audit_file('c:\audits\ServerAudit*', NULL, NULL)
WHERE
       database_name
       =
       'ACMEDB'
   AND (
       Statement LIKE '%DISABLE%TRIGGER%'
    OR Statement LIKE '%ENABLE%TRIGGER%')ORDER BY
                                          [Time] DESC;
Run Code Online (Sandbox Code Playgroud)

结果将显示谁禁用/启用触发器以及何时

在此处输入图片说明 尽管我们描述的解决方案仅适用于 SQL Server Enterprise Edition 和 SQL Server Developer Edition 用户,但 SQL Server 数据库审计实施起来相当简单,并且可以帮助跟踪禁用/启用触发器的时间

但是,即使对于在安装“审计”之前执行的操作,也可以捕获有关启用/禁用触发器的审计信息。您可以在如何审核您的审核 – 跟踪禁用触发器的在线文章中阅读更多相关信息

免责声明:我在 ApexSQL 担任产品支持工程师