Sql DDL触发一切

Sql DDL触发一切,sql,sql-server,azure,triggers,azure-sql-database,Sql,Sql Server,Azure,Triggers,Azure Sql Database,我用著名的DDL触发器触发数据库中发生的一切 在本例中,它被设置为 FOR CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE 但我假装要为每个DDL更改进行扩展,所以我搜索: 超过200项活动 我们可以用类似的东西吗? CREATE TRIGGER DDLTrigger_Sample ON DATABASE FOR ABSOLUTELY_EVERYTHING AS BEGIN 简短的回答是的。DDL触发器事件是分层的。您可

我用著名的DDL触发器触发数据库中发生的一切

在本例中,它被设置为

FOR CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE
但我假装要为每个DDL更改进行扩展,所以我搜索:

超过200项活动

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

CREATE TRIGGER DDLTrigger_Sample
    ON DATABASE
    FOR ABSOLUTELY_EVERYTHING
AS
BEGIN

简短的回答是的。DDL触发器事件是分层的。您可以在
sys.trigger\u event\u types
中看到这些关系。例如,让我们看看
DROP\u 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\u PROCEDURE
属于
DDL\u PROCEDURE\u EVENTS
DDL\u DATABASE\u LEVEL\u EVENTS
,以及
DDL\u EVENTS
(按粒度递减顺序)。假设您选择了
DDL\u DATABASE\u LEVEL\u 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