摘要:触发器,触发器是一种特殊类型的存储过程,它是通过事件触发而执行的。主要特点是,当被声明的事件发生时触发器被激活;触发器激活后不会立即执行,而是先测试触发条件;如果触发条件满足,则由DBMs执行与该触发器相连的动作。 创建触发器,不同数据库使用的触发器语法不同。
>>>>>数据库系统工程师历年真题
>>>>>数据库系统工程师网络课程
>>>>>数据库系统工程师视频课程
2016年软考数据库系统工程师知识点详解:触发器
触发器,触发器是一种特殊类型的存储过程,它是通过事件触发而执行的。主要特点是,当被声明的事件发生时触发器被激活;触发器激活后不会立即执行,而是先测试触发条件;如果触发条件满足,则由DBMs执行与该触发器相连的动作。
创建触发器,不同数据库使用的触发器语法不同。
例:假定银行数据库关系模式为: Account(Account-no,branch-name,balance)
Loan(Loan-no,branch-name,amount)
depositor(customer-name,Account-no)
假定银行在处理透支时,不是将账户余额设成负值,而是将账户余额设置为零,并且建立一笔贷款,其金额为透支金额。这笔贷款的贷款号应该等该透支帐户的账户号。采用SQL-99标准创建触发器如下:
CREATETRIGGERoverdraft_triggerafterupdateonAccount
Refferencingnewrowasnrow
Foreachrow
Whennrow.balance<0
Begainatomic
Insertintoborrower
(SELECTcustomer-name,Account-no
FROMdepositor
Wherenrow.account-no=depositor.account-no);
Insertintovalues
(nrow.account-no,nrow.branch-name,nrow.balance);
updateaccountsetbalance=0
Whereaccount.account-no=nrow.account-no
End
Whennrow.balance<0是触发条件;
Beginatomic...End子句用来将多行SQL语句集成为一个复合语句。其中前两条Insertinto语句表示在borrower和loan关系中建立新的贷款业务,update语句用来将账户余额清零。
Referencingoldrowas子句建立一个变量,用来存储已经被更新或删除的行的旧值。Referencingnewrowas可以被update和Insert语句使用,可以存放经过更新的新值。
Referencingoldtableas或Referencingnewtableas子句可以用来指向临时表,使之容纳所有被影响的行。临时表不能使用before触发器,但可以用after触发器。
触发器在事件之前被激发,可以避免非法更新。
例9.45:仓库管理数据库中有如下关系,
inventory(item,level),表示仓库中某种商品的现有量。
minlevel(item,level),表示仓库中存有某种商品的量小量。
reorder(item,amount),表示某种商品小于最小量时要订购的数量。
orders(item,amount),表示定购某种商品的量。
CREATETRIGGERreorder_triggerafterupdateofamountoninventory--我怀疑amount应该是level
Referencingoldrowasorow,newrowasnrow
Foreachrow
Whennrow.level<=(SELECTlevel
FROMminlevel
Whereminlevel.item=orow.item)
Andorow.level>(SELECTlevel
FROMminlevel
Whereminlevel.item=orow.item)
Begin
Insertintoorders
(SELECTitem,amount
FROMreorder
Wherereorder.item=orow.item)
End
删除触发器: DROPTRIGGER{trigger}[,...,n]
相关推荐:
>>>>>数据库系统工程师培训视频教程
>>>>>数据库系统工程师考试考前串讲
软考备考资料免费领取
去领取