一切的 DDL 触发器

Posted

技术标签:

【中文标题】一切的 DDL 触发器【英文标题】:DDL trigger for everything 【发布时间】:2018-05-23 15:45:14 【问题描述】:

我得到了著名的 DDL 触发器来触发数据库中发生的一切

https://www.mssqltips.com/sqlservertip/2085/sql-server-ddl-triggers-to-track-all-database-changes/

在例子中是设置的

FOR CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE

但我假装扩展每个 DDL 更改,所以我搜索: https://docs.microsoft.com/en-us/sql/relational-databases/triggers/ddl-events

超过 200 场活动!!

我们可以使用类似的东西吗?

CREATE TRIGGER DDLTrigger_Sample
    ON DATABASE
    FOR ABSOLUTELY_EVERYTHING
AS
BEGIN

【问题讨论】:

【参考方案1】:

简短的回答 - 是的。 DDL 触发事件是分层的。您可以在sys.trigger_event_types 中查看关系。例如,让我们看看DROP_PROCEDURE 存在的层次结构,我们可以使用这个查询:

WITH e AS (
    SELECT tet.type ,
           tet.type_name ,
           tet.parent_type, 1 AS level
    FROM sys.trigger_event_types AS tet
    WHERE tet.type_name = 'DROP_PROCEDURE'

    UNION ALL

    SELECT parent.type ,
           parent.type_name ,
           parent.parent_type, child.level + 1 AS level
    FROM e AS child
    JOIN sys.trigger_event_types AS parent
        ON child.parent_type = parent.type
)

SELECT *
FROM e
ORDER BY level DESC;

由此,我可以看到(在我的服务器上)DROP_PROCEDURE 属于DDL_PROCEDURE_EVENTSDDL_DATABASE_LEVEL_EVENTSDDL_EVENTS(按粒度递减顺序)。假设您选择了DDL_DATABASE_LEVEL_EVENTS,您可以算出下面将涵盖的所有内容。

WITH e AS (
    SELECT tet.type ,
           tet.type_name ,
           tet.parent_type, 1 AS level
    FROM sys.trigger_event_types AS tet
    WHERE tet.type_name = 'DDL_DATABASE_LEVEL_EVENTS'

    UNION ALL

    SELECT child.type ,
           child.type_name ,
           child.parent_type ,
           parent.level + 1 AS level
    FROM e AS parent
    JOIN sys.trigger_event_types AS child
        ON child.parent_type = parent.type
)

SELECT *
FROM e
ORDER BY level

【讨论】:

以上是关于一切的 DDL 触发器的主要内容,如果未能解决你的问题,请参考以下文章

Oracle-DDL 3- 触发器

数据库上的 Oracle ddl 触发器

当文章被更改时,DDL 触发器从复制中删除文章

Oracle创建禁止DDL的触发器

SQL Server 存储过程版本控制-DDL触发器

MySQL基础篇--在线DDL归纳总结