设计 DDL 触发器

更新日期: 2006 年 12 月 12 日

在设计 DDL 触发器之前,必须:

  • 了解 DDL 触发器的作用域。
  • 确定触发触发器的 Transact-SQL 语句或语句组。
ms186406.security(zh-cn,SQL.90).gif安全说明:
触发器内部的恶意代码可以在升级后的权限下运行。有关如何减少这种隐患的详细信息,请参阅管理触发器安全性

了解触发器的作用域

在响应当前数据库或服务器上处理的 Transact-SQL 事件时,可以触发 DDL 触发器。触发器的作用域取决于事件。例如,每当数据库中发生 CREATE TABLE 事件时,都会触发为响应 CREATE TABLE 事件创建的 DDL 触发器。每当服务器上发生 CREATE LOGIN 事件时,都会触发为响应 CREATE LOGIN 事件创建的 DDL 触发器。

在下面的示例中,每当数据库中发生 DROP TABLEALTER 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 触发器

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

发布日期 历史记录

2006 年 12 月 12 日

更改的内容:
  • 修正了如下错误信息:CREATE_DATABASE 事件无法用于激发 DDL 触发器。改用 ADD_ROLE_MEMBER 事件为例说明了有些事件可用于激发事件通知,但不可用于激发 DDL 触发器。

2006 年 7 月 17 日

更改的内容:
  • 更新了“了解触发器的作用域”中的第二个示例。