DDL触发器与DML触发器比较

时间:2021-07-10 05:04:39

DML触发器

DML触发器就是普通的  INSERT / UPDATE / DELETE 触发器。 DDL触发器就是一些特有的 DDL 语句的触发器。 例如:登陆到服务器的触发, 创建数据库的触发。  DML 触发器是当数据库服务器中发生数据操作语言 (DML) 事件时要执行的操作。DML 事件包括对表或视图发出的 UPDATE、INSERT 或 DELETE 语句。DML 触发器用于在数据被修改时强制执行业务规则,以及扩展 Microsoft SQL Server 约束、默认值和规则的完整性检查逻辑。  MicrosoftSQL Server 提供两种主要机制来强制使用业务规则和数据完整性:约束和触发器。触发器为特殊类型的存储过程,可在执行语言事件时自动生效。SQL Server 包括三种常规类型的触发器:DML 触发器、DDL 触发器和登录触发器。  当服务器或数据库中发生数据定义语言 (DDL) 事件时将调用 DDL 触发器。有关详细说明,请参阅 DDL 触发器。登录触发器将为响应 LOGON 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。有关详细信息,请参阅登录触发器。 当数据库中发生数据操作语言 (DML) 事件时将调用 DML 触发器。DML 事件包括在指定表或视图中修改数据的 INSERT 语句、UPDATE 语句或 DELETE 语句。DML 触发器可以查询其他表,还可以包含复杂的 Transact-SQL 语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到错误(例如,磁盘空间不足),则整个事务即自动回滚。 DML 触发器在以下方面非常有用:  DML 触发器可通过数据库中的相关表实现级联更改。不过,通过级联引用完整性约束可以更有效地进行这些更改。  DML 触发器可以防止恶意或错误的 INSERT、UPDATE 以及 DELETE 操作,并强制执行比 CHECK 约束定义的限制更为复杂的其他限制。  与 CHECK 约束不同,DML 触发器可以引用其他表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其他操作,如修改数据或显示用户定义错误信息。  DML 触发器可以评估数据修改前后表的状态,并根据该差异采取措施。  一个表中的多个同类 DML 触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的操作来响应同一个修改语句。  DDL触发器  DDL 触发器是一种特殊的触发器,它在响应数据定义语言 (DDL) 语句时触发。它们可以用于在数据库中执行管理任务,例如,审核以及规范数据库操作。  像常规触发器一样,DDL 触发器将激发存储过程以响应事件。但与 DML 触发器不同的是,它们不会为响应针对表或视图的 UPDATE、INSERT 或 DELETE 语句而激发。相反,它们将为了响应各种数据定义语言 (DDL) 事件而激发。这些事件主要与以关键字 CREATE、ALTER 和 DROP 开头的 Transact-SQL 语句对应。执行 DDL 式操作的系统存储过程也可以激发 DDL 触发器。 重要提示:  测试您的 DDL 触发器以确定它们是否响应运行的系统存储过程。例如,CREATE TYPE 语句和 sp_addtype 存储过程都将激发针对 CREATE_TYPE 事件创建的 DDL 触发器。. DDL 触发器可用于管理任务,例如审核和控制数据库操作。 如果要执行以下操作,请使用 DDL 触发器:

要防止对数据库架构进行某些更改。  希望数据库中发生某种情况以响应数据库架构中的更改。 要记录数据库架构中的更改或事件。  仅在运行触发 DDL 触发器的 DDL 语句后,DDL 触发器才会激发。DDL 触发器无法作为 INSTEAD OF 触发器使用。  下面的示例显示如何使用 DDL 触发器阻止修改或删除数据库中的任何表。 CREATE TRIGGER safety  ON DATABASE   FOR DROP_TABLE, ALTER_TABLE  AS      PRINT You must disable Trigger "safety" to drop or alter tables!    ROLLBACK   可以激发 DDL 触发器以响应在当前数据库或当前服务器中处理的 Transact-SQL 事件。触发器的作用域取决于事件。有关 DDL 触发器作用域的详细信息,请参阅设计 DDL 触发器。 若要获取 AdventureWorks2008R2 示例数据库中提供的 DDL 触发器示例,请在 SQL Server Management Studio 的对象资源管理器中打开位于 AdventureWorks2008R2 数据库的“可编程性”文件夹中的 Database Triggers 文件夹。右键单击 ddlDatabaseTriggerLog 并选择“编写数据库触发器脚本为”。默认情况下,DDL 触发器 ddlDatabaseTriggerLog 处于禁用状态

 

DDL触发器和DML触发器的用处不同

DML 触发器在 INSERT、UPDATE 和 DELETE 语句上操作,并且有助于在表或视图中修改数据时强制业务规则,扩展数据完整性。  DDL 触发器对 CREATE、ALTER、DROP 和其他 DDL 语句以及执行 DDL 式操作的存储过程执行操作。它们用于执行管理任务,并强制影响数据库的业务规则。它们应用于数据库或服务器中某一类型的所有命令。可以使用相似的 Transact-SQL 语法创建、修改和删除 DML 触发器和 DDL 触发器,它们还具有其他相似的行为。  与 DML 触发器相同,DDL 触发器可以运行在 Microsoft.NET Framework 中创建的以及在 SQL Server 中上载的程序集中打包的托管代码。与DML 触发器相同,可以为同一个 Transact-SQL 语句创建多个 DDL 触发器。同时,DDL 触发器和激发它的语句运行在相同的事务中。可从触发器中回滚此事务。严重错误可能会导致整个事务自动回滚。从批处理中运行并显式包含ROLLBACK TRANSACTION 语句的DDL触发器将取消整个批处理。  注意  不能回滚发生在 DDL 触发器正文内的 ALTER DATABASE 事件。  与 DML 触发器相同,可以嵌套 DDL 触发器。设计 DDL 触发器时,请从下列几个方面考虑它们与 DML 触发器的不同:  只有在完成 Transact-SQL 语句后才运行 DDL 触发器。DDL 触发器无法作为 INSTEAD OF 触发器使用。  DDL 触发器不会创建插入的和删除的表。可以使用 EVENTDATA 函数捕获有关激发 DDL 触发器的事件以及触发器导致的后续更改的信息。