设计 DDL 触发器
更新日期: 2006 年 12 月 12 日
在设计 DDL 触发器之前,必须:
- 了解 DDL 触发器的作用域。
- 确定触发触发器的 Transact-SQL 语句或语句组。
安全说明: |
---|
触发器内部的恶意代码可以在升级后的权限下运行。有关如何减少这种隐患的详细信息,请参阅管理触发器安全性。 |
了解触发器的作用域
在响应当前数据库或服务器上处理的 Transact-SQL 事件时,可以触发 DDL 触发器。触发器的作用域取决于事件。例如,每当数据库中发生 CREATE TABLE 事件时,都会触发为响应 CREATE TABLE 事件创建的 DDL 触发器。每当服务器上发生 CREATE LOGIN 事件时,都会触发为响应 CREATE LOGIN 事件创建的 DDL 触发器。
在下面的示例中,每当数据库中发生 DROP TABLE
或 ALTER TABLE
事件,都将触发 DDL 触发器 safety
:
CREATE TRIGGER safety
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE
AS
PRINT 'You must disable Trigger "safety" to drop or alter tables!'
ROLLBACK
;
在下面的示例中,如果当前服务器实例中发生任何 CREATE DATABASE
事件,DDL 触发器将显示一条消息。该触发器使用 EVENTDATA
函数检索相应的 Transact-SQL 语句的文本。有关如何在 DDL 触发器中使用 EVENTDATA 的详细信息,请参阅使用 EVENTDATA 函数。
IF EXISTS (SELECT * FROM sys.server_triggers
WHERE name = 'ddl_trig_database')
DROP TRIGGER ddl_trig_database
ON ALL SERVER;
GO
CREATE TRIGGER ddl_trig_database
ON ALL SERVER
FOR CREATE_DATABASE
AS
PRINT 'Database Created.'
SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
GO
DROP TRIGGER ddl_trig_database
ON ALL SERVER;
GO
本主题后面的“选择触发 DDL 触发器的特定 DDL 语句”一部分中提供了一些链接,通过这些链接可以找到将 Transact-SQL 语句映射到为它们指定的作用域的列表。
数据库范围内的 DDL 触发器都作为对象存储在创建它们的数据库中。可以在 master 数据库中创建 DDL 触发器,这些 DDL 触发器的行为与在用户设计的数据库中创建的 DDL 触发器一样。可以从创建 DDL 触发器的数据库上下文中的 sys.triggers 目录视图中,或通过指定数据库名称作为标识符(例如 master.sys.triggers)来获取有关这些 DDL 触发器的信息。
服务器范围内的 DDL 触发器作为对象存储在 master 数据库中。不同的是,可以从任何数据库上下文中的 sys.server_triggers 目录视图中获取有关数据库范围内的 DDL 触发器的信息。
有关如何检索 DDL 触发器的元数据的详细信息,请参阅获取有关 DDL 触发器的信息。
对于影响局部或全局临时表和存储过程的事件,不会触发 DDL 触发器。
指定 Transact-SQL 语句或语句组
可以创建响应以下事件的 DDL 触发器:
- 一个或多个特定 DDL 语句
- 预定义的一组 DDL 语句
选择触发 DDL 触发器的特定 DDL 语句
可以安排在运行一个或多个特定 Transact-SQL 语句后触发 DDL 触发器。在前面的示例中,在发生 DROP TABLE 事件或 ALTER TABLE 事件后触发触发器 safety。
并非所有的 DDL 事件都可用于激发 DDL 触发器。有些事件只适用于异步非事务语句。例如,ADD_ROLE_MEMBER 事件无法用于激发 DDL 触发器。应为这些事件使用事件通知。有关事件通知的详细信息,请参阅事件通知(数据库引擎)。
触发 DDL 触发器的 DDL 事件主题列出了可以指定哪个 Transact-SQL 语句触发 DDL 触发器,以及它们可以触发的作用域。
选择触发 DDL 触发器的一组预定义的 DDL 语句
可以在执行属于一组预定义的相似事件的任何 Transact-SQL 事件后触发 DDL 触发器。例如,如果希望在运行 CREATE TABLE、ALTER TABLE 或 DROP TABLEDDL 语句后触发 DDL 触发器,则可以在 CREATE TRIGGER 语句中指定 FOR DDL_TABLE_EVENTS。运行 CREATE TRIGGER 后,事件组涵盖的事件都添加到 sys.trigger_events 目录视图中。
用于激发 DDL 触发器的事件组主题列出了可以触发 DDL 触发器的多组预定义的 DDL 语句、它们涵盖的特定语句以及这些事件组可以触发的作用域。
请参阅
概念
使用 EVENTDATA 函数
了解 DDL 触发器
实现 DDL 触发器
帮助和信息
更改历史记录
发布日期 | 历史记录 |
---|---|
2006 年 12 月 12 日 |
|
2006 年 7 月 17 日 |
|