请高手进来,关于触发器的问题!!

fly_miss 2003-12-12 11:54:53
在for Insert,Update中,要判断表中两个字段是否发生了变化,如果发生了变化,就要把当前记录写入到其他表里

我写了如下:
---是否是修改
if exists(select 1 from deleted where PersonalGuid =@vID)
begin
if update(field1) or update (field2)
insert into tJS001PersonalBasicInfo_His select * from inserted where fPersonalGuid=@vID
end
可是只要该条记录发生了变化(不管是不是那两个字段)都向其他表里写!!
因为,还有其他动作,所以必须在for insert ,update中写
...全文
56 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdhdy 2003-12-12
  • 打赏
  • 举报
回复
--如果field1和field2被用原来的值更新,用if update(字段1) or update(字段2)判断似乎不可以
if exists(select b.* from inserted a,deleted b where a.fPersonalGuid=b.fPersonalGuid and (a.field1<>b.field1 or a.field2<>b.field2))
insert into tJS001PersonalBasicInfo_His select * from inserted where fPersonalGuid=@vID
victorycyz 2003-12-12
  • 打赏
  • 举报
回复
这里没有问题,是不是你在其他的代码中改动了这两个字段,或是还有另外的触发器?
zjcxc 元老 2003-12-12
  • 打赏
  • 举报
回复
--应该用update判断指定字段是否修改:

if update(字段1) or update(字段2)
insert into tJS001PersonalBasicInfo_His select * from inserted where fPersonalGuid=@vID
w_rose 2003-12-12
  • 打赏
  • 举报
回复
create trigger .... for insert as
insert into tJS001PersonalBasicInfo_His select * from inserted
go
create trigger .... for update as
insert into tJS001PersonalBasicInfo_His select i.* from inserted as i
inner join deleted as d on i.PersonalGuid=i.PersonalGuid
where i.field1<>d.field1 or i.field2<>d.field2
go
w_rose 2003-12-12
  • 打赏
  • 举报
回复
insert into tJS001PersonalBasicInfo_His select i.* from inserted as i
left join deleted as d on i.PersonalGuid=i.PersonalGuid
where i.field1<>d.field1 or i.field2<>d.field2 or d.field1 is null

不过,还是把insert和update触发器分开写清楚啦。insert的时候,还用得着判断吗?
w_rose 2003-12-12
  • 打赏
  • 举报
回复
看到“from deleted where PersonalGuid =@vID”我要杀人!哈哈!

“变化”是什么意思呢?对于“update ... set field1=field1”,也就是说用与原来相等的值更新自己,update(field1)也成立。如果你将客户端更新服务器记录的操作写成一个存储过程,并且存储过程中没有做复杂的判断,很可能作了这些(可能)多余的更新操作。这样,检验特殊的变化可以:

insert into tJS001PersonalBasicInfo_His
select i.* from inserted as i left join deleted as d on i.PersonalGuid=i.PersonalGuid
where i.field1<>d.field1 or i.field2<>d.field2
fly_miss 2003-12-12
  • 打赏
  • 举报
回复
不过sdhdy(大江东去...) 的好像也不行,我也不知道。。。。?
fly_miss 2003-12-12
  • 打赏
  • 举报
回复
谢谢,各位了,
我找到问题了, 因为field1和field2被用原来的值更新
就象sdhdy(大江东去...) 说的,所以
update就不能适用这种情况!!!
fly_miss 2003-12-12
  • 打赏
  • 举报
回复
用update判断指定字段是否修改,好像不行,好像只要这条记录被修改了
update()就为true了

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧