概述
4-2触发器
tags:数据库
触发器是用户定义在关系表上的一类由时间驱动的特殊过程.一旦定义,触发器就将被保存在数据库服务器中,任何用户对表增,删,改操作均由服务器自动激活相应的触发器,在关系数据库管理系统的核心层进行集中控制.
定义触发器
触发器又叫做事件-条件-动作规则.当特定的系统事件发生时,对规则的条件进行检查,如果条件成立则执行规则中的动作,否则不执行该动作.
create trigger <触发器名> 每当触发时间发生时,该处发起被激活
{before|after}<触发事件>on<表名> 指明触发器激活时间
referencing new|old row as <变量> 指出引用的变量
for each{row|statement} 定义触发器的类型,指明动作体执行的频率 注意sql server无此功能
[when<触发事件>]<触发动作体> 当触发条件为真时执行触发动作体
触发器各部分语法说明
说明:
1. 只有表的拥有者才能在表上创建存储发起,并且一个表只能创建一定数量的触发器.
2. 触发器名,同一模式下触发器名必须唯一,并且触发器名和表名必须在同一模式下.
3. 表名,触发器只能定义在基本表上,不能定义在视图上.
4. 触发事件,insert delete update ,也可是这几个事件的组合如 insert or delete等
5. 触发器类型,触发器按照所触发动作间隔尺寸可分为行级触发器和语句级触发器.应该注意的是sql server 中无行级触发器需要使用游标进行对应操作.
6. 触发条件,触发器被激活时只有当触发条件为真时触发动作体才执行,如果省略when触发条件,则触发动作体在触发器激活后执行
7. 触发动作体,触发动作体既可以是一个匿名PL/SQL过程块,也可以是对已经创建存储过程的调用.如果是行级触发器,用户可以在过程体中使用NEW 和OLD 引用 update / insert 事件之后的新值和uppdate/delete事件之前的旧值;如果是语句级触发器,则不能在号出发动作体中使用NEW 或者 OLD
create trigger sc_t
after update of grade on sc
referencing
oldrow as oldtuple
newrow as newtuple
for each row
when (newtuple.grade >=1.1 * oldtuple.grade)
insert into sc_u(sno,cno,oldgrade,newgrade)
value(oldtuple.sno,oldtuple.cno,oldtuple.grade,newtuple.grade)
begin
if(newtuple.job='教授')and(newtuple.sal<4000)
then newtuple.sal:=4000
end if
end;
end;
在本例中referencing指出应用的变量,如果触发事件是update操作并且有for each row 子句,则可以使用的变量有oldrow和newrow,分别表示修改之前的元组和修改之后的元组.若没有for each row 子句,则可以应用的变量有oldtable 和newtable.
for each statement 语句级触发器,执行完insert语句后下面的触发动作体才执行一起
触发器的执行顺序
对于同一个表上的多个before触发器,遵循’谁先创建谁执行的原则’
sql server触发器
SQL Server为每个触发器都创建了两个专用表:Inserted表和Deleted表。这两个表由系统来维护﹐它们存在于内存中而不是在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行 完成后﹐与该触发器相关的这两个表也被删除。
Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。
Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。
sql server没有行级触发器.
最后
以上就是酷炫金毛为你收集整理的4-2触发器4-2触发器的全部内容,希望文章能够帮你解决4-2触发器4-2触发器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复