Sql DDL触发一切
我用著名的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触发器事件是分层的。您可
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