请问这个trigger如何写?(200分)

教父

Unregistered / Unconfirmed
GUEST, unregistred user!
有三个表t1,t2,t3,t1中有a1,a2两个字段,t2中有b1,b2两个字段,t3中有c1,c2两个字段。
其中a1与a2是一对一的关系,a1与b1相等,b1与b2是一对多的关系,b2与c1相等,
c1与c2是一对一的关系。
现在要求我修改了a2时,trigger要设置c2的值为1。
请问要如何写法?
 
很简单啊,sql2000:
create trigger on t1
for update
as
declare @a1 varchar
select @a1=a1 from updated
update t3 set c2=1 from t2,t3 where
t2.b2=t3.c1 and t1.b1=@a1
 
我的数据库是oracle,我改了一下你写的,
CREATE OR REPLACE TRIGGER "CNINFO"."TEST_T1"
AFTER INSERT OR UPDATE OF "A1"
ON "T1"
FOR EACH ROW
declare
va varchar2(10)
begin
select va=:new.a1 from updated
update t3 set c2=1 from t2,t3 where
t2.b2=t3.c1 and t1.b1=va
end;

但是通不过编译,是哪里写得不对吗?
 
不会吧,有updated
应该是先deleted
然后是inserted吧
应该这一句改为了:
select va=:new.a1 from deleted
 
我现在改为用游标,循环读取每一个值,但是不知道怎么样才能中止这个循环!!
declare
vname varchar2(10);
cursor test_cur(key varchar2) is
select b2 from cninfo.t2
where b1 = key;
begin
open test_cur:)new.a1);
for vname in test_cur loop /*这个for通不过编译,是语法有问题吗?我可是对着书写的。*/
update cninfo.t3 set c2=1
where c1 = vname;
end loop;
/* loop 这个循环怎么结束法?书上说可以通过检查%NOTFOUND等变量,但我的也是通不过编译
fetch test_cur into vname;
update cninfo.t3 set c2=1
where c1 = vname;
end loop;*/
close test_cur;
end;

急啊,在线等待,有答案立刻给分!!
 
终于搞定了,原来是用
if test_cur %NOTFOUND then
exit;
end if;
也就是在%NOTFOUND前还要加游标名。

用游标是可以了,但是有人说直接用一个语句就可以实现上述功能了,不知道是不是可行,
我再看看高手的意见。
 
oracle好久没用了。
要结束循环应该很简单的事啊,
有个全局变量好像是%%NOTFOUND,你查查帮助文件。
不过用游标速度可能会慢很多,
你看看能不能把我上面的语句改变到oracle,
主要是oracle没有deleted表,updated表。
对应的好像是:eek:ld,:New,可以直接用:New.a1表示,
你改一改看看行不行?
 
select va=:new.a1 from updated
这个updated我不知道怎么改啊。
 
updated用:new表示就是了。
试试:不知道oracle有没有下面的写法,我这里没有环境
declare @a1 varchar;
select @a1=a1 from :New; //赋值语句可能不对
update t3 set c2=1 from t2,t3 where
t2.b2=t3.c1 and t1.b1=@a1;
 
用个子查询语句就可以实现,可以不用游标

va=:eek:ld.a1 ;
update t3 set c2=1 where exists
(
select t3.c1 from t2,t3 where
t2.b2=t3.c1 and t1.b1=va
);
 
楼上的,
:eek:ld应该是:New吧
va=:eek:ld.a1;
update t3 set c2=1 from t2,t3 where
t2.b2=t3.c1 and t1.b1=va;
 
我试了一下,Walone的方法基本上可行,但是update t3 set c2=1 where exists
要改为update t3 set c2=1 where c1 in
不过还是非常感谢上面几位。
 
to book523:
应该是:eek:ld,是指的未修改前相关联的值。

to 教父:
是我写的有问题。用exists就应该没有问题的。in的效率比exists要低很多,
如果表比较大的话,最好不要用in操作。这样所有的索引都不管用了。

va=:eek:ld.a1 ;
update t3 alias_t3 set c2=1 where exists --加个别名
(
select t3.c1 from t2,t3
where t2.b2=t3.c1
and t1.b1=va
and t3.c1 = alias_t3.c1 --加上这个关联就可以了
);



 
再次感谢Walone,我在数据库方面一向很弱,特别最近搞的oracle以前根本没有接触过,
以后还望多多指点!
 
不必客气
我上手做第一个项目时,也是用oracle,那时对它也是一窍不通
不过还是硬着头皮下来了,从中学到了好多好多
过程是艰难的,前途是光明的
 
顶部