SQL SERVER 触发器
<1>触发器的相关问题
1.触发器中有两个特殊的表,分别是?
插入表inserted和删除表deleted
2.触发器类型分为?
INSERT触发器(当向表中插入数据时触发,自动执行触发器中定义的SQL语句)
UPDATE触发器(当删除表中记录时触发,自动执行触发器中定义的SQL语句)
DELETE触发器(当更新表中某列或多列时触发,自动执行触发器中定义的SQL语句)
3.创建删除触发器的语法?
create trigger trigger_name
on 表名for delete
as
sql语句.......
go
<2>什么是触发器
1.触发器是在对表进行插入、更新或删除操作时自动执行的存储过程,触发器通常用于强制业务规则,触发器是一种高级约束,可以定义比用CHECK 约束更为复杂的约束,可执行复杂的SQL语句(if/while/case)、可引用其它表中的列
2. 触发器定义在特定的表上,与表相关,自动触发执行,不能直接调用,是一个事务(可回滚)。
<3>inserted 和deleted 表
触发器触发时:
1系统自动在内存中创建deleted表或inserted表
2.只读,不允许修改;触发器执行完成后,自动删除。
inserted 表
1.临时保存了插入或更新后的记录行
2.可以从inserted表中检查插入的数据是否满足业务需求
3.如果不满足,则向用户报告错误消息,并回滚插入操作
deleted 表:
1.临时保存了删除或更新前的记录行
2.可以从deleted表中检查被删除的数据是否满足业务需求
3. 如果不满足,则向用户报告错误消息,并回滚插入操作
<4> inserted 和deleted 表的功能
1.inserted表和deleted表存放的信息。
修改操作 inserted表 deleted表
增加(INSERT)记录 存放新增的记录 ------
删除(DELETE)记录 ----- 存放被删除的记录
修改(UPDATE)记录 存放更新后的记录 存放更新前的记录
2. 创建触发器的语法
CREATE TRIGGER 触发器名
ON 表名 [WITH ENCRYPTION] FOR [DELETE, INSERT, UPDATE]
AS
T-SQL语句..........
GO
注释:WITH ENCRYPTION表示加密触发器定义的SQL文本,DELETE, INSERT, UPDATE指定触发器的类型
<5>列级 UPDATE 触发器
1. update触发器无论是对表中的一行或多行,还是一列或多列,都将执行触发器操作。但是在实际需求中,可能只关心对特定列是否被更新。如果特定的列被更新,就执行触发器操作。
2.这可以通过列上的update语法:if update<列名>来实现。在同一个触发器的定义语句中,可以使用多条if update 语句来对不同的列的修改执行不同的触发器操作。
注释:关键代码--set nocount on
<7>instead of触发器的使用
1.instead of触发器的使用范围,instead of 触发器可以同时在数据表和视图中使用。通常在以下几种情况下,建议使用instead of触发器:
2.数据库里的数据禁止修改:例如电信部门的通话记录是不能修改的,一旦修改,则通话费用的计数将不准确。
3.有可能要回滚修改的SQL语句
4.在视图中使用触发器
5.用自己的方式去修改数据
第七章 SQL SERVER 数据库(附加内容)
1.DML 触发器:
1.是当数据库服务器中发生数据操作语言 (DML) 事件时要执行的操作。DML 事件包括对表或视图发出的 UPDATE、INSERT 或 DELETE 语句。DML 触发器用于在数据被修改时强制执行业务规则,以及扩展 Microsoft SQL Server 约束、默认值和规则的完整性检查逻辑。
2.Microsoft SQL Server 提供两种主要机制来强制使用业务规则和数据完整性:约束和触发器。触发器为特殊类型的存储过程,可在执行语言事件时自动生效。
3.SQL Server 包括三种常规类型的触发器:DML 触发器、DDL 触发器和登录触发器。
4.当数据库中发生数据操作语言 (DML) 事件时将调用 DML 触发器。DML 事件包括在指定表或视图中修改数据的 INSERT 语句、UPDATE 语句或 DELETE 语句。DML 触发器可以查询其他表,还可以包含复杂的 Transact-SQL 语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到错误(例如,磁盘空间不足),则整个事务即自动回滚。
5.DML 触发器在以下方面非常有用:
(1)DML 触发器可通过数据库中的相关表实现级联更改。不过,通过级联引用完整性约束可以更有效地进行这些更改。
(2)DML 触发器可以防止恶意或错误的 INSERT、UPDATE 以及 DELETE 操作,并强制执行比 CHECK 约束定义的限制更为复杂的其他限制,与 CHECK 约束不同,DML 触发器可以引用其他表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其他操作,如修改数据或显示用户定义错误信息。
(3)DML 触发器可以评估数据修改前后表的状态,并根据该差异采取措施。
6.一个表中的多个同类 DML 触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的操作来响应同一个修改语句。
2.AFTER 触发器
1.在执行了 INSERT、UPDATE 或 DELETE 语句操作之后执行 AFTER 触发器。指定 AFTER 与指定 FOR 相同,它是 Microsoft SQL Server 早期版本中唯一可用的选项。AFTER 触发器只能在表上指定。
3..INSTEAD OF 触发器
1. 执行 INSTEAD OF 触发器代替通常的触发动作。还可为带有一个或多个基表的视图定义 INSTEAD OF 触发器,而这些触发器能够扩展视图可支持的更新类型。
4.CLR 触发器
1.CLR 触发器可以是 AFTER 触发器或 INSTEAD OF 触发器。CLR 触发器还可以是 DDL 触发器。CLR 触发器将执行在托管代码(在 .NET Framework 中创建并在 SQL Server 中上载的程序集的成员)中编写的方法,而不用执行 Transact-SQL 存储过程
5.创建 DDL 触发器
1.DDL 触发器是使用 DDL 触发器的 Transact-SQL CREATE TRIGGER 语句创建的。
2. 创建 DDL 触发器语法
CREATE TRIGGER (Transact-SQL)
3.删除 DDL 触发器
DROP TRIGGER (Transact-SQL)
注释:SQL Server 的未来版本中将删除从触发器返回结果集的功能。返回结果集的触发器可能会引起应用程序出现并非计划中与它们协同工作的意外行为。避免在新的开发工作中从触发器返回结果集,并计划修改当前执行此操作的应用程序。若要在 SQL Server 2008 中防止触发器返回结果集,请将 disallow results from triggers 选项设置为 1。在 SQL Server 的未来版本中,该选项的默认设置将为 1。
注意:服务器作用域的 DDL 触发器显示在 SQL Server Management Studio 对象资源管理器中的“触发器”文件夹中。此文件夹位于“服务器对象”文件夹下。数据库范围的 DDL 触发器显示在“数据库触发器”文件夹中。此文件夹位于相应数据库的“可编程性”文件夹下。
6.修改 DDL 触发器
1.如果必须修改 DDL 触发器的定义,只需一个操作即可删除并重新创建触发器,或重新定义现有触发器。如果更改了由 DDL 触发器引用的对象的名称,则必须修改触发器,以使其文本反映新的名称。因此,在重命名对象之前,需要先显示该对象的依赖关系,以确定所建议的更改是否会影 响任何触发器。也可将触发器修改为对定义进密。
2.修改触发器语法
ALTER TRIGGER (Transact-SQL)
7.查看触发器的依赖关系
sys.sql_expression_dependencies (Transact-SQL)
sys.dm_sql_referenced_entities (Transact-SQL)
sys.dm_sql_referencing_entities
8.禁用和删除 DDL 触发器
1.当不再需要某个 DDL 触发器时,可以禁用或删除该触发器。
2.禁用 DDL 触发器不会将其删除。该触发器仍然作为对象存在于当前数据库中。但是,当运行编写触发器程序所用的任何 Transact-SQL 语句时,不会激发触发器。可以重新启用禁用的
3.DDL 触发器。在启用 DDL 触发器后,该触发器的激发方式与其最初创建时的激发方式相同。创建的 DDL 触发器默认处于启用状态。
4.删除DDL触发器时,该触发器将从当前数据库中删除。DDL 触发器范围内的任何对象或数据均不受影响。
9.禁用 DDL 触发器
DISABLE TRIGGER (Transact-SQL)
ALTER TABLE (Transact-SQL)
10.启用 DDL 触发器
ENABLE TRIGGER (Transact-SQL)
ALTER TABLE (Transact-SQL)
11.删除 DDL 触发器
DROP TRIGGER (Transact-SQL)