`
huangronaldo
  • 浏览: 220690 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

六、触发器

 
阅读更多

触发器

      触发器是一种特殊类型的存储过程,不由用户直接调用。创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行。

      触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。

 

 

创建触发器:

 

create trigger 触发器名称
on 表名
for  动作(insert|update|delete)
as
    if update(recommend) --条件
begin
    触发器语句
end 
 

 

 

instead of 语句用于替换要执行的动作,如

 

 

create trigger 触发器名称
on 表名
instead of  动作(insert|update|delete)
as
begin
    触发器语句
end 
 

 

将不执行相应的动作而只执行触发器里自定义的语句

同理 instead of 替换成 after或者before 分别表示执行动作后和动作前执行

关键在于Inserted表

触发器语句中使用了两种特殊的表:deleted 表和 inserted


Deleted 表用于存储 DELETE 和 UPDATE 语句所影响的行的复本。在执行 DELETE 或 UPDATE 语句时,行从触发器表中删除,并传输到 deleted 表中。Deleted 表和触发器表通常没有相同的行。

 

Inserted 表用于存储 INSERT 和 UPDATE 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到 inserted 表和触发器表中。Inserted 表中的行是触发器表中新行的副本。

 

1.插入操作(Insert)
Inserted表有数据,Deleted表无数据

2.删除操作(Delete)
Inserted表无数据,Deleted表有数据

3.更新操作(Update)
Inserted表有数据(新数据),Deleted表有数据(旧数据)

 

 

 

删除触发器

 drop trigger 触发器名称

 drop trigger 触发器名称,触发器名称...  -------删除多个触发器


注意:触发器名称是不加引号的。在删除触发器之前可以先看一下触发器是否存在:
if Exists(select name from sysobjects where name=触发器名称 and xtype='TR')

 

重命名触发器

exec sp_rename 原名称, 新名称


sp_rename 是 SQL Server™ 自带的一个存储过程,用于更改当前数据库中用户创建的对象的名称,如表名、列表、索引名等。

 

更多触发器相关....

(1) INSTEAD OF子句
执行触发器语句,但不执行触发触发器的 SQL 语句,比如试图删除一条记录时,将执行触发器指定的语句,此时不再执行 delete 语句。例:
create trigger f
on tbl
instead of delete
as
    insert into Logs...

(2) IF UPDATE(列名) 子句
检查是否更新了某一列,用于 insert 或 update,不能用于 delete。例:
create trigger f
on tbl
for update
as
    if update(status) or update(title)
        sql_statement --更新了 status 或 title 列

(3) inserteddeleted (两个临时表的使用)
这是两个虚拟表,inserted 保存的是 insert 或 update 之后所影响的记录形成的表,deleted 保存的是 delete 或 update 之前所影响的记录形成的表。例:
create trigger tbl_delete
on tbl
for delete
as
    declare @title varchar(200)
    select @title=title from deleted
    insert into Logs(logContent) values('删除了 title 为:' + title + '的记录')
说明:如果向 inserted 或 deleted 虚拟表中取字段类型为 text、image 的字段值时,所取得的值将会是 null。

查看数据库中所有的触发器

 

use 数据库名
go
select * from sysobjects where xtype='TR'

sysobjects 保存着数据库的对象,其中 xtype 为 TR 的记录即为触发器对象。在 name 一列,我们可以看到触发器名称。

sp_helptext 查看触发器内容

 

use 数据库名
go
exec sp_helptext '触发器名称'

将会以表的样式显示触发器内容。
除了触发器外,sp_helptext 还可以显示 规则、默认值、未加密的存储过程、用户定义函数、视图的文本

用企业管理器查看

在表上点右键->“所有任务”->“管理触发器”,选择所要查看的触发器存储过程

sp_helptrigger 用于查看触发器的属性

sp_helptrigger 有两个参数:第一个参数为表名;第二个为触发器类型,为 char(6) 类型,可以是 INSERT、UPDATE、DELETE,如果省略则显示指定表中所有类型触发器的属性。

例:

use 数据库名
go
exec sp_helptrigger tbl

 

递归、嵌套触发器

递归分两种,间接递归和直接递归。我们举例解释如下,假如有表1、表2名称分别为 T1、T2,在 T1、T2 上分别有触发器 G1、G2。

·                     间接递归:对 T1 操作从而触发 G1,G1 对 T2 操作从而触发 G2,G2 对 T1 操作从而再次触发 G1...

·                     直接递归:对 T1 操作从而触发 G1,G1 对 T1 操作从而再次触发 G1...

嵌套触发器

类似于间接递归,间接递归必然要形成一个环,而嵌套触发器不一定要形成一个环,它可以 T1->T2->T3...这样一直触发下去,最多允许嵌套 32 层。

 

 

设置直接递归

默认情况下是禁止直接递归的,要设置为允许有两种方法:

·                     T-SQL:exec sp_dboption 'dbName', 'recursive triggers', true

·                     EM:数据库上点右键->属性->选项。

设置间接递归、嵌套

默认情况下是允许间接递归、嵌套的,要设置为禁止有两种方法:

·                     T-SQL:exec sp_configure 'nested triggers', 0 --第二个参数为 1 则为允许

·                     EM:注册上点右键->属性->服务器设置。

 

触发器回滚

我们看到许多注册系统在注册后都不能更改用户名,但这多半是由应用程序决定的,如果直接打开数据库表进行更改,同样可以更改其用户名,在触发器中利用回滚就可以巧妙地实现无法更改用户名。

use 数据库名
go
create trigger tr
on 表名
for update
as
    if update(userName)
        rollback tran

关键在最后两句,其解释为:如果更新了 userName 列,就回滚事务。

禁用、启用触发器

禁用:alter table 表名 disable trigger 触发器名称
启用:alter table 表名 enable trigger 触发器名称

如果有多个触发器,则各个触发器名称之间用英文逗号隔开。

如果把“触发器名称”换成“ALL”,则表示禁用或启用该表的全部触发器。

 

分享到:
评论

相关推荐

    数电实验实验五、六触发器、计数器.docx

    数电实验实验五、六触发器、计数器.docx数电实验实验五、六触发器、计数器.docx数电实验实验五、六触发器、计数器.docx数电实验实验五、六触发器、计数器.docx数电实验实验五、六触发器、计数器.docx数电实验实验五...

    实验六:创建存储过程和触发器1

    1.了解存储过程的功能特点 2.掌握 SQL Server 创建和管理存储过程的方法,存储过程的参数定义和存储过程的执行 2.掌握 SQLServer 触发器的

    数据库实验6 触发器

    数据库 实验6 触发器 更新颖更灵活的实验技巧,希望能帮助到大家

    数字逻辑模6计数器D触发器实现电路

    计数器

    MySQL与Oracle 差异比较之六触发器

    主要介绍了MySQL与Oracle 差异比较之六触发器,需要的朋友可以参考下

    实验六-触发器实验报告.doc

    SQL DML 语句 ( INSERT、 DELETE 或 UPDATE) AFTER 指定了触发器在处理完成后触发 BEFORE 指定了触发器在处理完成前触发 默认情况下,触发器每个表触发一次 FOR EACH ROW 选项指定触发器每行触发一次(即触发器为...

    数据库实验六

    理解视图的概念和相关命令,并掌握视图相关的SQL语句 理解存储过程的概念和相关命令,并掌握存储过程相关的SQL语句 理解触发器的概念和相关命令,并掌握触发器相关的SQL语句

    74hc14六反相斯密特触发器.pdf

    74hc14六反相斯密特触发器

    sqlserver触发器例子

    六﹕相关示例﹕ 1﹕在Orders表中建立触发器﹐当向Orders表中插入一条订单记录时﹐检查goods表的货品状态status是否为1(正在整理)﹐是﹐则不能往Orders表加入该订单。 create trigger orderinsert on orders ...

    实验六 游标、存储过程与触发器

    这是数据库系统概论的游标、存储过程与触发器实验报告含代码,截图,步骤齐全,

    触发器实验报告.doc

    如双D 74LS74、四D 74LS175、六D 74LS174等。 图5-8-3 为双D 74LS74的引脚排列及逻辑符号。功能如表5-8-3。 图5-8-3 74LS74引脚排列及逻辑符号 表5-8-3 表5-8-4 "输 入 "输 出 " "[pic"[pic"CP "D "Qn+1...

    74LS174 6位触发器

    74LS174为6位正逻辑上升沿触发D触发器

    SQL Server数据库中使用触发器经验谈

    触发器是数据库应用中的重用工具,它的应用很广泛。当触发INSERT触发器时,新的数据行就会被插入到触发器表和inserted表中。inserted表是一个逻辑表,它包含了已经插入的数据行的一个副本。inserted 表包含了INSERT...

    MySQL 触发器的基础操作(六)

    1.为什么使用触发器:   在MySQL数据库中,数据库对象表是存储和操作数据的逻辑结构,而数据库对象触发器则用来实现由一些表事件触发的某个操作。在数据库系统中,当执行表事件时,则会激活触发器,从而执行器...

    锁相同步触发器的设计

    本文着重介绍锁相环在变流领域中的多相同步触发器中的应用。具体介绍了一个实际的六拍同步触女 器的设计方法, 这个方法也适用于十二相或更多相数的同步触发器。

    oracle触发器使用,很详细

    触发器使用教程和命名规范 1 1,触发器简介 1 2,触发器示例 2 3,触发器语法和功能 3 4,例一:行级触发器之一 4 5,例二:行级触发器之二 4 ...9,例六:用包封装触发器代码 10 10,触发器命名规范 11

    7414_TTL_六反相施密特触发器.rar

    关于六反相触发器的很详细的资料。包括其管脚的介绍。简单的原理。

    实验六 存储过程与触发器的创建实验bySixdb.pdf

    存储过程与触发器的创建实验 报告、个人总结 内附详细的实验步骤,包含SQL源码及操作截图 更加详细的介绍请查看liushendb的博客《数据库实验——存储过程与触发器的创建实验by SixInNight》

    实验六-数据库的存储过程和触发器.doc

    实验六-数据库的存储过程和触发器.doc

Global site tag (gtag.js) - Google Analytics