关于oracle触发器实现两个表按条件同步数据,大家帮帮忙......

A表和B表的表结构相同A(id,name,dept),表B(id,name,dept),name和dept作为主键,想要实现当向A表中进行数据的增删改操作时,B表同样进行... A表和B表的表结构相同 A(id,name,dept) ,表B(id,name,dept),name和dept作为主键,想要实现当向A表中进行数据的增删改操作时,B表同样进行增删改操作,唯一要注意的是,当向A表中插入,修改或删除记录的dept字段以00XXX开头的情况下,B表同步的操作记录dept字段要插入01XXX 修改或删除01XXX的记录
现在如果不考虑dept 00改01的条件下同步数据已经实现,主要是怎么加入条件限制的功能
create or replace trigger TR_TESTAA_SYN after insert or update or delete
on A for each row
declare
integrity_error exception;
errno integer;
errmsg char(200);
dummy integer;
found boolean;

begin
if inserting then
insert into B(id,name,dept) values(:NEW.id,:NEW.name,:NEW.dept);
elsif updating then
update B set id=:NEW.id,name=:NEW.name,dept=:NEW.dept where name=:OLD.name and dept=:OLD.dept ;
elsif deleting then
delete from B where name=:OLD.name and dept=:OLD.dept ;
end if;
exception
when integrity_error then
raise_application_error(errno, errmsg);
end;
展开
 我来答
阚菊库娴
2019-05-19 · TA获得超过3.7万个赞
知道大有可为答主
回答量:1.4万
采纳率:30%
帮助的人:869万
展开全部
比较常见的trigger错误,你这一句话因为有触发器所以要对同一个表改两次,
最好不要用trigger了,直接把处理写到程序里面更好,更容易控制,不容易产生不可预知的后果,或者性能问题。
具体语句的话,可以考虑使用pragma
autonomous_transaction,但是不建议。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hongyaofu
推荐于2017-09-04 · TA获得超过1088个赞
知道大有可为答主
回答量:1227
采纳率:87%
帮助的人:527万
展开全部
create or replace trigger TR_TESTAA_SYN after insert or update or delete
on A for each row
declare
    integrity_error exception;
    errno            integer;
    errmsg           char(200);
    dummy            integer;
    found            boolean;
    vdept A.dept%TYPE;
begin
IF SUBSTR(:NEW.dept,1,2)='00' THEN
vdept:='01'+SUBSTR(:NEW.dept,3,3);
ELSE
--这个else是如果头两位不是'00'的情况;如果还有很多种情况,则这个ifelse要改成case语句了。
vdept:=:NEW.dept;
END IF;
if inserting then
    insert into B(id,name,dept) values(:NEW.id,:NEW.name,vdept);
elsif updating then
    update B set id=:NEW.id,name=:NEW.name,dept=:NEW.dept where name=:OLD.name and dept=vdept ;
elsif deleting then
    delete from B where name=:OLD.name and dept=vdept ;
end if;
exception
    when integrity_error then
       raise_application_error(errno, errmsg);
end;
追问
谢谢,可是上面的写法只能实现插入新记录的需求,对于修改和删除操作对关联的表B是没有触发效果的,要怎么办呢
追答
create or replace trigger TR_TESTAA_SYN after insert or update or delete
on A for each row
declare
    integrity_error exception;
    errno            integer;
    errmsg           char(200);
    dummy            integer;
    found            boolean;
    vdept   A.dept%TYPE;
begin
IF SUBSTR(:NEW.dept,1,2)='00' THEN
    vdept:='01'+SUBSTR(:NEW.dept,3,3);
ELSE
    --这个else是如果头两位不是'00'的情况;如果还有很多种情况,则这个ifelse要改成case语句了。
    vdept:=:NEW.dept;
END IF;
if inserting then
    insert into B(id,name,dept) values(:NEW.id,:NEW.name,vdept);
elsif updating then
    update B set id=:NEW.id,name=:NEW.name,dept=vdept where name=:OLD.name and dept=vdept ;
elsif deleting then
    delete from B where name=:OLD.name and dept=vdept ;
end if;
exception
    when integrity_error then
       raise_application_error(errno, errmsg);
end;
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式