update 触发器中的inserted表和deleted表又没有联系(sqlserver自身的)
我现在要改一个表a的主键字段(id),触发修改表b中的id列,如何实现?
create table a(id int not null,constraint PK_1 primary key (id))
create table b(field1 int,id int)
a的update触发器
create trigger tt
on a
for update
as
begin
if update(id)
update b set id = c.id
from b,inserted c,deleted d
where b.id = d.id ----问题出在这里,inserted表与deleted表孤立
end
go
还有,Inserted 、 deleted表在什么时候删除?一个事物提交后?
问题点数:50、回复次数:12Top
1 楼pbsql(风云)回复于 2005-06-20 16:53:49 得分 1
你的表应该加个列,该列在其他列改变时不会改变(如identity),这样才能把更改前后的值对应起来Top
2 楼vivianfdlpw()回复于 2005-06-20 17:06:12 得分 15
create trigger tt
on a
for update
as
begin
if update(id)
update b set id=(select id from inserted) where id=(select id from deleted)
end
goTop
3 楼nsqsmile(阿南)回复于 2005-06-20 17:44:38 得分 0
回复人: pbsql(风云)
如果这样的话,我还不如直接不用触发器了,放到一个事务中提交.
回复人: vivianfdlpw()
你的方法确实可以,但没看懂id=(select id from inserted)这个,能不能讲一下,Top
4 楼wangdehao(找找找(现在很幸福))回复于 2005-06-20 19:29:33 得分 1
To:vivianfdlpw()
如果inserted表和deleted表中有多条记录的话就不可以了Top
5 楼vivianfdlpw()回复于 2005-06-20 20:22:03 得分 5
建议你使用foreign keyTop
6 楼vivianfdlpw()回复于 2005-06-20 21:39:37 得分 5
--创建测试环境
create table a
(
id int ,
name varchar(20)
)
create table b
(
id int,
sex bit
)
go
set nocount on
go
--创建触发器
create trigger a_to_b
on a
for update
as
select * into #1 from inserted
select * into #2 from deleted
update b set id=A.id from b, #1 A , #2 BB where BB.id=b.id
drop table #1
drop table #2
go
--插入数据
insert a select 1,'AAAAA' union select 2,'A2324'
insert b select 1,1 union select 2,0
--更新一条数据
update a set id=100 where id=2
--更新多条数据
update a set id=1000
--查询结果
select * from a
select * from b
--删除测试环境
drop table a
drop table b
Top
7 楼nsqsmile(阿南)回复于 2005-06-21 02:40:19 得分 0
vivianfdlpw() 你的测试的和我问题中的有什么不同?Top
8 楼xiaonvjing(飞扬)回复于 2005-06-21 04:13:49 得分 1
首先我解释一下:
系统在处理update动作时,它先删除该条记录,然后再添加一条符合条件的记录
在使用update触发器时,你可以根据自己的需求,如果你需要新添加的记录,
你可以选择inserted 表(当激活触发器时,新添加的记录被保存在inserted表中);
如果你需要修改后的那条记录,你可以使用deleted表(当触发器被激活后,修改前的
那条记录被保存在deleted表)中。当触发器执行完成后,这两个表即被删除。Top
9 楼xiaonvjing(飞扬)回复于 2005-06-21 04:43:09 得分 1
现在将你的代码,改一下就可以啦。
也就是 vivianfdlpw() 的方法,是对的
create trigger tt
on a
for update
as
if update(id)
begin
update b set id=(select id from inserted) where id in (select id from deleted)
end
解释一下:
id=(select id from inserted)
当触发器被激活后,就有inserted这个表,这个表此时,就保存了你刚刚修改a表后的id.
此时,你将新修改后的id赋值给b表,就ok啦
找修改条件,需要修改前的ID ,所以用到deleted这个表,不知我的解释你否明白。
Top
10 楼yesyesyes()回复于 2005-06-21 08:16:47 得分 18
最简单的方法就是两表的id建立级联更新关系,不要触发器Top
11 楼pengxuan(网虫先生)回复于 2005-06-21 09:01:31 得分 2
同意楼上的,建立两个表的的主键外键级联更新Top
12 楼xdhou(办公室坐久了,想晒晒太阳)回复于 2005-06-21 09:36:28 得分 1
建个唯一健就可以了.Top




