按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
SYNTAX
CREATE 'OR REPLACE' TRIGGER 'schema。'trigger_name
{BEFORE | AFTER}
{DELETE | INSERT | UPDATE 'OF column'; column'。。。'}
'OR {DELETE | INSERT | UPDATE 'OF column '; column' 。。。'}'。。。
ON 'schema。'table
''REFERENCING { OLD 'AS' old 'NEW 'AS' new'
| NEW 'AS' new 'OLD 'AS' old'}'
FOR EACH ROW
'WHEN (condition)' '
pl/sql statements。。。
触发机制对于强制执行引用完整性非常有用 我们在第 9 天 创建和维护表 中学习
如何创建表时曾经提到过 强制执行引用完整性可以保证在多表交叉访问时数据的有效性
如果用户输入了下边的命令
INPUT
1》 insert RECORDINGS values (12; 〃The Cross of Changes〃; 3; 1994)
274
…………………………………………………………Page 275……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
2》 go
分析
这是一个有效的在表 RECORDINGS 表中插入新记录的命令 可是 对 ARTISTS 表进
行一下快速的检查后你会发现并没有 ARTIST_ID=12 的记录 用户所拥有的在
RECORDINGS 表中插入记录的权利可以彻底地破坏你的数据引用完整性
注 尽管有许多数据库系统都可以通过在创建表的时候设置约束来强制执行数据的引
用完整性 但是触发机制却提供了更为灵活的解决方法 约束将会把系统的错误信息返回
给用户 并且 你现在可能已经知道了 这些错误信息有时对你没有多大的帮助 而作为
另外一种方法 触发机制可以打印出错误信息 调用其它的存贮过程 如果有必要 它还
可以修正错误信息
触发机制与事务处理
触发机制所进行的活动是被默认为事务处理的一部分进行的 主要的事件次序如下
1 默认地自动运行 BEGIN TRANSACTION 语句 对于表和触发机制而言
2 当插入 更新 删除操作发生时
3 触发机制被调用 其中的语句被自动执行
4 由触发机制自动的完成事务处理的取消或确认操作
例 13。9
本例解决了早些时候更新 RECORDINGS 表时所带来的问题
INPUT
1》 create trigger check_artists
2》 on RECORDINGS
3》 for insert; update as
4》 if not exists (select * from ARTISTS; RECORDINGS
5》 where ARTISTS。artist_id = RECORDINGS。artist_id)
6》 begin
7》 print 〃Illegal Artist_ID!〃
8》 rollback transaction
9》 end
275
…………………………………………………………Page 276……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
10》 go
分析
类似的问题也可能在删除 RECORDINGS 表中的记录时出现 如果你只是将
RECORDINGS 表中将某个艺术家删除了 你可能也想同时删除 ARTIST 表中的艺术家记
录 如果在触发机制激活之前记录已经被删除了 那么你如何才能知道哪一个 ARTIST_ID
记录才是需要删除的记录呢 对于这个问题有两种解决的办法
l 将 ARTIST 表中的所有不在 RECORDINGS 表中存在记录的艺术家删除 见例
13。10a
l 检查被删除过的逻辑表 Transcat…SQL 可以维护两个表 DELETED 和
INSERTED 这两个表中保存着对真实表的最近所做的改动 它与触发机制所创
建的表有着相同的结构 因此 你可以从 DELETE 表中获得 ARTIST_ID 的内容
并将它从 ARTIST 中删除 见例 13。10b
例 13。10a
INPUT
1》 create trigger delete_artists
2》 on RECORDINGS
3》 for delete as
4》 begin
5》 delete from ARTISTS where artist_id not in
6》 (select artist_id from RECORDINGS)
7》 end
8》 go
例 13。10b
1》 create trigger delete_artists
2》 on RECORDINGS
3》 for delete as
4》 begin
5》 delete ARTISTS from ARTISTS; deleted
6》 where ARTIST。artist_id = deleted。artist_id
7》 end
276
…………………………………………………………Page 277……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
8》 go
使用触发机制时的限制
l 当你在使用触发机制时你必须要知道它有如下的使用限制
l 不能在临时表中创建触发机制
l 触发机制必须在当前的表所在的数据库中创建
l 不能在视图中创建触发机制
l 当表被删除以后 所有与之相关的触发机制会被自动地删除
触发机制的嵌套
触发机制也可以被嵌套 比如说你可以创建一个触发机制来执行删除动作 例如 如
果触发机制自己删除了一个记录 数据库服务器可以据此激活另一个触发机制 结果将会
不停地循环 直到表中的所有记录都被删除掉 或一些其他的触发条件被激活 嵌套机制
不是默认的 可是 环境中必须提供这个功能 对于这个主题你可以参考你的数据库文档
来得到更多的内容
在选择语句中使用更新和删除
这是复合使用更新和删除语句的命令
INPUT
SQL》 UPPDATE EMPLOYEE_TBL
SET LAST_NAME = 'SMITH'
WHERE EXISTS (SELECT EMPLOYEE_ID
FROM PAYROLL_TBL
WHERE EMPLOYEE_ID = 2);
OUTPUT
1 row updated。
分析
EMPLOYEE 表中有一个雇员的名字是不