您的位置:首页 > 数据库

4-2触发器

2016-06-30 13:15 260 查看

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没有行级触发器.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库 触发器