http://qsfwy.iteye.com/category/35969
触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录、更改记录或者删除记录时,当事件发生时,才被自动地激活。也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。
基本语句如下﹕
create trigger trigger_name
on {table_name | view_name}
{for | After | Instead of }
[ insert, update,delete ]
as
sql_statement
有insert,update,delete三种触发器。for 和after :同义(更准确的说用for时默认的是after)。
After 在触发事件发生以后才被触发,只可以建立在表上。
Instead of 代替了相应的触发事件而被执行,既可以建立在表上也可以建立在视图上。
当触发DELETE触发器后,从受影响的表中删除的行将被放置到一个特殊的deleted表中。deleted表是一个逻辑表,它保留已被删除数据行的一个副本。
当触发INSERT触发器后,新的数据行就会被插入到inserted表中。inserted表是一个逻辑表,它包含了已经插入的数据行的一个副本。
当触发UPDATE触发器后,(可以看成是先删除后添加)被删除的原始行被移入deleted表中,被添加的更新后的行被移入inserted表中。
下面我们利用delete触发器实现一个级联删除(当删除一个学生后连他的成绩也一并删除):
create trigger Stu_src
on student
after delete
as
delete from score where sid in (select id from deleted)
设置某触发器可用或不可用
alter table 表名
disable trigger 触发器名
alter table 表名
enable trigger 触发器名
删除某触发器
drop trigger 触发器名
我们再来举例说明一下操作时机为instead of的触发器,只是举例子,一般不会这么写触发器(更新一个学生时检查其更新的学号是否为0701110123,是的话只更新该学号,不是的话事务回滚):
create trigger Stu
on student
instead of update
as
declare @afterlearnid varchar(50)
declare @beforelearnid varchar(50)
set @afterlearnid=(select learnid from inserted)
set @beforelearnid=(select learnid from deleted)
if @afterlearnid='0701110123'
update student set learnid=@afterlearnid where learnid=@beforelearnid
else
rollback transaction
如果按一般的理解 Instead of 代替了相应的触发事件而被执行,我们会想如果没有执行触发事件(这里是更新)肯定deleted,inserted表里没有东西,但其实它们里面是有东西的,而且该怎么样还是怎么样,但要知道deleted,inserted表只是逻辑表,所以跟影响的实表没关系。
update student set learnid='0701110123',sname='六六六' where learnid='0701110122'
这里满足触发器里的学号要求,但从最后的结果中可以看出确实是触发器中的语句代替了这条语句,因为我们在语句中更新了学生名字,但实际上没有更新,因为触发器中的语句没有更新学生名字。
虽说操作时机为after的触发器是在触发事件执行后而被执行的,但仍然能在触发器中执行事务回滚致使触发事件(执行的语句)无效:
create trigger updatestu
on student
after update
as
if update(sname)
rollback transaction
if update (col_name):表明所作的操作对指定列是否有影响,有影响,则激活触发器。
update student set learnid='0701110123',sname='六六六' where learnid='0701110128'这里对sname有更新,所以会激活触发器执行事务回滚。
分享到:
相关推荐
在"oracle练习题关于触发器的作业"中,你可能需要设计和实现各种类型的触发器来解决实际问题。例如,你可能需要创建一个触发器来确保表中的某个字段始终具有唯一的值,或者在更新记录时自动更新另一相关表的数据。 ...
### 关于触发器的知识详解 #### 一、触发器概述 **触发器**是一种存储过程,它被设计为对特定事件作出反应,并自动执行一系列预定义的动作。在数据库管理系统(DBMS)中,触发器通常用来维护数据的一致性和完整性。 ...
SQL关于触发器的源码
触发器的一些例子,可以快速的使用触发器进行数据库编程
本课件主要探讨了触发器的几个关键类型及其电气特性,包括基本触发器、钟控触发器、主从触发器以及集成边沿触发器。 首先,触发器有两大基本要求:一是具备两个稳定的状态,通常表示为0和1,用于存储数据;二是能够...
在TP7.ppt这个文件中,可能包含了关于触发器的详细讲解,包括其在实际项目中的应用案例、触发器的编写语法以及最佳实践。而SQLQuery1.sql可能包含了一些示例SQL语句,用于创建、修改或删除触发器,也可能展示了...
在SQL(Structured Query Language)中,触发器和存储过程是两个重要的数据库管理工具,它们用于扩展数据库的功能并实现复杂的业务逻辑。以下是对这两个概念的详细解释: **触发器(Triggers)** 触发器是一种...
在"实验二十五 触发器.ppt"中,你将找到关于触发器更详细的讲解,包括示例和实践练习,这对于理解和掌握这一概念非常有帮助。通过深入学习,你将能够更好地在实际的网络数据库环境中运用触发器,确保数据的准确性和...
以下是关于触发器的详细解释: 1. **触发器的创建**: - `TRI_INSERT` 触发器:这个触发器在尝试向Student表插入新记录时被激活。如果新插入的学生学号(Sno)大于200215130,则允许插入,否则操作将被拒绝。...
通过执行 `DESC information_schema.TRIGGERS` 可以查看此表的结构,从而获取关于触发器的更多信息。 #### 五、触发器的常见问题及解决方案 1. **触发器执行顺序**:触发器的执行顺序在 MySQL 源代码中有所规定。...
根据提供的文件信息,我们可以分析并总结出以下关于触发器的相关知识点: ### 触发器概述 触发器(Trigger)是一种特殊类型的存储过程,它在特定的数据库操作(如INSERT、UPDATE或DELETE)执行时自动激活。触发器...
以下是一些关于触发器的关键知识点: 1. **触发器的类型**:Oracle支持多种类型的触发器,包括行级触发器、语句级触发器和模式触发器。行级触发器对每一行数据的变化都有反应,而语句级触发器则只在语句完成时执行...
在`oracle触发器语法.txt`中,你应该能找到关于触发器的创建、删除以及不同类型的触发器(如行级和语句级)的详细语法。 通过学习这些例子,你将能够更好地理解和应用Oracle中的函数、游标和触发器。实践是掌握这些...
以下是一些关于触发器的关键知识点: 1. **类型**:Oracle支持三种类型的触发器——行级触发器(处理单个行)、语句级触发器(处理整个SQL语句)和复合触发器(结合了行级和语句级触发器的特性)。 2. **创建...
主要讲解数据库中关于触发器的内容 触发器常用的功能 DML触发器 CREATE TRIGGER语法
通过查询数据字典视图,如DBA_TRIGGERS或USER_TRIGGERS,可以获取关于触发器的信息,如触发器的名称、状态、触发时间等。 **8.5 数据库触发器的应用举例** 触发器在数据库应用中发挥着重要作用,如实现复杂的业务...
sqlserver 触发器 insert阿 一个关于触发器的小例子
本资料包集合了多种关于触发器的资源,涵盖了从基础理论到实际应用的广泛内容,旨在帮助读者深入理解和掌握这一核心概念。 首先,我们来详细探讨触发器的基本概念。触发器是一种双稳态电路,具有两个稳定状态,可以...