oracle的级联更新、删除

oracle只有级联删除,没有级联更新 针对需要进行级联更新操作的解决办法如下:

一种做法是通过写存储过程来完成,先将子表更新,再更新主表

  这种做法一定要先把约束关系disable掉,再做(子表更新时,主表里没有这个值,违法引用完整性,除非不建立关系)。
  先将子表更新,再更新主表
  你可以通过数据字典找到约束关系,通过这些关系,确定这个主表都被那些表引用了,然后先更新子表,再更新主表
  最后再把约束关系enable  

还有一种做法是写触发器

  写个例子

Table   dd   (id   number,name   varchar(20) 主表
Table   cc(id   number   ,name   varchar(20) 从表

create   or   replace   trigger   tri_update
  after   update   on   cc
  for   each   row
  declare
        cursor   cur_update   is   select   id   from   dd;
                  id   cc.id%type;

 begin
            for   i   in   cur_update     loop 
              if   id=i.id   then update   cc  

        set   id   =   :new.id   where   id   =i.id;
      elsif   
                reise_application_error(-20000, '主表中没有此值 '||:new.id); 
           end   if; 
     end   loop;
  end;

更为完整的做法请参考CSDN博文:Oracle 通过触发器级联更新 (http://blog.csdn.net/gcgamer/article/details/7434404

至于级联删除操作:

建FOREIGN   KEY   时这样建立:
create   constraint   foreign   key   fk_cc_id   on(cc.id)   reference   dd(id)   on   delete   cascade
 
以上内容来自CSDN:对主表怎样进行级联更新,删除(语句) ,本人菜鸟对触发器不了解,特别在网上查了一些信息:
 
  触发器是一种特殊类型的存储过程,当使用下面的一种或多种数据修改操作在指定表中对数据进行修改时,触发器会生效:UPDATE、INSERT   或   DELETE。
  触发器是自动的:它们在对表的数据作了任何修改(比如手工输入或者应用程序采取的操作)之后立即被激活。
  触发器是在 update,delete,insert 表之后引发的的特殊存储过程 以后无论多少程序,只要修改此表,就会自动调用此过程,而无须在程序中调用
 
  简单地说触发器是当对表进行增、删、改时执行的SQL语句,功能上和存储过程一样。顾名思义,一触即发。
  触发器是自动执行的,存储过程必须在程序中显示调用!

能用存储过程就用存储过程。尽量不要使用触发器
假如你是多人使用的﹐触发器最好少用﹐因为﹐如果两个人同时触发了触发程序
那如何办?

假如没有应用服务器,那么DB服务器的负担将加重.
假如要进行数据库的迁移,比方说从SQL Server的数据库迁移到Oracle的话.
那么大量的触发器和存储过程将给你带来很多的麻烦.
因为各个DBMS的语法及处理方式皆不同.

本人小白 以上内容纯属兴趣整理,如有与事实出入望指正,TKS!

 

 

 

 

 

posted @ 2012-10-08 14:55  温特  阅读(475)  评论(0)    收藏  举报