友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

SQL 21日自学通(V3.0)(PDF格式)-第94章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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 表中有一个雇员的名字是不
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!