`
huangronaldo
  • 浏览: 222432 次
  • 性别: 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数电实验实验五...

    数据库实验6 触发器

    ### 数据库实验6:触发器 #### 一、实验背景及目标 本次实验的主要目的是让学生深入理解并掌握数据库触发器的使用方法。触发器是一种特殊类型的存储过程,它被自动执行,当特定事件(如数据的插入、更新或删除)...

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

    实验六的目的是深入理解并掌握SQL Server中的存储过程和触发器。存储过程是预编译的SQL语句集合,它们可以被多次调用,提高了代码的重用性和执行效率,同时降低了网络流量。以下是关于存储过程和触发器的详细解释: ...

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

    标题中的“数字逻辑模6计数器D触发器实现电路”指的是使用D触发器构建一个能够计数到模6(即0,1,2,3,4,5后回到0)的数字计数器。D触发器是一种常用的时序逻辑器件,它在每个时钟脉冲到来时,将数据输入D的值存储到...

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

    触发器在数据库系统中是一种非常重要的机制,它们允许在特定的数据操作(如插入、更新或删除)发生时自动执行一段程序代码。MySQL和Oracle作为两种广泛使用的数据库管理系统,它们在触发器的实现和使用上存在一定的...

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

    实验六的目的是深入理解Oracle数据库中的触发器,特别是行级触发器的原理和应用。触发器是一种数据库对象,用于在特定的数据操作(如INSERT、DELETE、UPDATE)发生时自动执行预定义的PL/SQL代码,以实现数据一致性、...

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

    实验六主要涵盖了数据库管理系统中的三个核心概念:游标、存储过程和触发器,这些都是数据库操作中的高级技术,常用于复杂的逻辑处理和数据管理。 1. **游标**:游标是一种在结果集上进行逐行操作的技术。在实验中...

    数据库实验六

    【数据库实验六】主要涉及了数据库中的三个重要概念:视图、存储过程和触发器,以及如何使用SQL语句来创建和操作它们。本实验旨在帮助学生深入理解这些概念,并熟练掌握相关命令。 1. **视图**是数据库中一个虚拟的...

    触发器创建与管理实验 .docx

    六、结论 通过本实验,我们掌握了触发器的概念、类型、功能和工作原理,并学会了创建、更改、删除触发器的方法。此外,我们还学习了如何利用触发器维护数据完整性。触发器是一种非常有用的机制,可以帮助我们维护...

    CMOS—D触发器原理

    #### 六、结论 综上所述,CMOS D触发器作为一种重要的时序逻辑元件,在现代数字系统中发挥着不可或缺的作用。通过深入分析其工作原理及特性,不仅可以帮助我们更好地理解和应用这一基本组件,还能为未来设计更加...

    sqlserver触发器例子

    #### 六、触发器示例 下面是一些具体的触发器示例: 1. **限制插入操作** 创建一个触发器,当尝试向`Orders`表中插入一条订单记录时,检查`Goods`表中对应商品的状态是否为“正在整理”(即状态值为1),如果是,...

    RS触发器应用详解

    #### 六、RS触发器的逻辑符号 RS触发器的逻辑符号通常包含两个输入端(S和R)以及两个输出端(Q和Q')。对于低电平有效的输入端,通常会在逻辑符号上标出小圆圈。 #### 七、RS触发器的应用——抗抖动 RS触发器的...

    PLSQL触发器.pdf

    if to_char(sysdate, 'dy') in ('星期六', '星期日') then case when inserting then raise_application_error(-20001, '周末不能增加员工'); when updating then raise_application_error(-20002, '周末不能...

    sql防注入触发器

    #### 六、注意事项 - **性能考量**:虽然触发器能够有效地增强安全性,但过多的触发器可能会导致性能下降,特别是在高并发环境下。因此,在设计触发器时应考虑其对整体性能的影响。 - **误报与漏报**:尽管本例中的...

    SQL触发器使用实例

    #### 六、总结 通过上述示例,我们可以看到触发器是如何帮助维护数据完整性的。触发器可以在不显式调用的情况下自动执行预定义的操作,这对于实现复杂业务逻辑非常有用。在实际应用中,合理地使用触发器可以极大地...

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

    74HC14是一款集成电路,它包含了六个反相斯密特触发器。这款芯片主要用于数字信号处理,可以将输入的模拟信号转换为清晰定义的数字信号,特别适用于时序电路和脉冲整形应用。 斯密特触发器的核心特性是其具有回转点...

    触发器和时序逻辑电路

    #### 六、寄存器 **寄存器**是一组触发器的集合,用于存储多比特的数据。根据寄存器中的数据是否可以顺序移动,寄存器可以分为两大类:**非移位寄存器**和**移位寄存器**。 - **非移位寄存器**:主要用于存储数据...

Global site tag (gtag.js) - Google Analytics