大家看看update型触发器究竟错哪了?

shuiwencai 2007-12-25 09:22:13
CREATE TABLE [dbo].[测试表1] (
[样品点编号] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[样品编号] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[A] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[B] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[C] [char] (10) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[测试表2] (
[统一编号] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[样品编号] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[A] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[B] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[C] [char] (10) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
两张表,测试表1更新时,检查测试表2中的对应记录是否更新,关键字为前边两个.
我在测试表1上写触发器如下:
CREATE TRIGGER [Update_ceshi] ON [dbo].[测试表1]
FOR UPDATE
AS
declare @old_tybh nvarchar(17)
declare @old_ypbh nvarchar(20)
Select @old_tybh=d.样品点编号,@old_ypbh=d.样品编号
from deleted d
select 统一编号 from 测试表2 where 统一编号=@old_tybh and 样品编号=@old_ypbh
if @@rowcount>0
begin
declare @a char(10)
declare @b char(10)
declare @c char(10)
-- update 测试表2 Set A=
--更新对应的A,B,C
end
问题出现在:当测试表1中加如记录,想修改时,则弹出"无法为更新定位行",但如果我在测试表2中加入两个都相同的记录时,就不弹出提示了?
测试表1,测试表2上再无其他关系,和触发器:请问我的触发器哪有问题?

...全文
176 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuiwencai 2007-12-25
  • 打赏
  • 举报
回复
to yesyesyes:没贴上建主键的语句.
shuiwencai 2007-12-25
  • 打赏
  • 举报
回复
to Haiwer:我这样写的,看有什么问题,测试也能成功

CREATE TRIGGER [Update_ceshi] ON [dbo].[测试表1]
FOR UPDATE
AS
if exists ( --这个判断是防止无限递归的
select 1
from 测试表2,Inserted i,deleted d
where 测试表2.统一编号=d.样品点编号 and 测试表2.样品编号=d.样品编号
)
update 测试表2
set A=i.A,B=i.B,C=i.C
from 测试表2,Inserted i,deleted d
where 测试表2.统一编号=d.样品点编号 and 测试表2.样品编号=d.样品编号




yesyesyes 2007-12-25
  • 打赏
  • 举报
回复
yesyesyes 主键,是前两个字段,已经说过了。
====
你贴的建表语句中没有
昵称被占用了 2007-12-25
  • 打赏
  • 举报
回复

CREATE TRIGGER [Update_ceshi] ON [dbo].[测试表1]
FOR UPDATE
AS
begin
--1、增加
set nocount on

--2、限定主键不能修改
if update(样品点编号) or update(样品编号)
begin
RAISERROR ('主键不能修改',16, 1)
ROLLBACK TRANSACTION
return
end

update t
set t.A=i.A,t.B=i.B,t.C=i.C
from 测试表2 t , deleted d , inserted i
where t.统一编号=d.样品点编号 and t.样品编号=d.样品编号
--3、增加条件
and d.样品点编号=i.样品点编号 and i.样品编号=d.样品编号


end


昵称被占用了 2007-12-25
  • 打赏
  • 举报
回复
上班时间,详细说有点困难

shuiwencai 2007-12-25
  • 打赏
  • 举报
回复
yesyesyes 主键,是前两个字段,已经说过了。
shuiwencai 2007-12-25
  • 打赏
  • 举报
回复
To Haiwer:如果修改每个字段都进行判断的话:
如你所说:
if update (value) --只有修改value才触发
begin
if exists ( --这个判断是防止无限递归的
select 1
from T2,Inserted i,deleted d
where i.id=d.id
and i.id=T2.id
and i.value<>d.value
)
update T2
set value=i.Value
from T2,Inserted i,deleted d
where i.id=d.id
and i.id=T2.id
and i.value<>d.value --这个条件保证只有真正修改了值才触发
end
多列,要都这样写?
yesyesyes 2007-12-25
  • 打赏
  • 举报
回复
目标表没有主键或唯一键
shuiwencai 2007-12-25
  • 打赏
  • 举报
回复
to leo_lesley :
谢谢先,不过你的语句,一样出现错误!当测试表1中存在的记录,测试表2中没有的时候,一样报错,"无法为更新定位行"
To Haiwer :正在看你的blog.,你不能说如何解决吗?
leo_lesley 2007-12-25
  • 打赏
  • 举报
回复
----try 

CREATE TRIGGER [Update_ceshi] ON [dbo].[测试表1]
FOR UPDATE
AS
begin
update t
set t.A=i.A,t.B=i.B,t.C=i.C
from 测试表2 t , deleted d , inserted i
where t.统一编号=d.样品点编号 and t.样品编号=d.样品编号
end
leo_lesley 2007-12-25
  • 打赏
  • 举报
回复
----try

CREATE TRIGGER [Update_ceshi] ON [dbo].[测试表1]
FOR UPDATE
AS
begin
update t
set t.A=i.A,t.B=i.B,t.C=i.C
from 测试表2 t , deleted d , inserted i
where t.统一编号=d.样品点编号 and t.样品编号=d.样品编号
end
昵称被占用了 2007-12-25
  • 打赏
  • 举报
回复
shuiwencai 2007-12-25
  • 打赏
  • 举报
回复
测试多条记录如下:
测试表1
insert into 测试表1(样品点编号,样品编号,A,B,C) Values('1','2','3','4','5')
insert into ................................Values('2','3','4','5','6')
测试表2

insert into 测试表2(统一编号,样品编号,A,B,C) Values('1','2','3','4','5')
insert into ................................Values('2','3','4','5','6')

//测试更新.

Update 测试表1
Set A='AB'

结果:
(所影响的行数为 3 行)


(所影响的行数为 4 行)


昵称被占用了 2007-12-25
  • 打赏
  • 举报
回复
有问题,如果一次修改多条记录,你的连接条件不够的

gimse7en 2007-12-25
  • 打赏
  • 举报
回复
mark

34,590

社区成员

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

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