一切的 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_EVENTS
、DDL_DATABASE_LEVEL_EVENTS
和DDL_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 触发器的主要内容,如果未能解决你的问题,请参考以下文章