MS SQL关于使用触发器和游标同步更新数据的问题

我想实现表A的字段A1与库qb表B的字段B1同步他们有相同的关联字段C,即当表A的A1的数据发生变动时那么更新库qb表B里的B1字段下面是我写的代码ALTERTRIGGE... 我想实现表A的字段A1与库qb表B的字段B1同步他们有相同的关联字段C,即当表A的A1的数据发生变动时那么更新库qb表B里的B1字段
下面是我写的代码
ALTER TRIGGER [dbo].[update_B_toA] ON [dbo].[A]
for Update
AS
declare @C varchar(20)
IF Update (A1)
BEGIN
declare @A decimal
declare tc cursor for select i.A1 as A11,i.C as C1 from inserted i,deleted d where i.ID=d.ID
open tc
fetch next from tc into @A,@C
while @@fetch_status=0
begin
--insert into test select @A,@C--这一句成功的
update qb.dbo.B set B1=@A where C= @C
fetch next from tc into @A,@C
end
close tc
deallocate tc
END

当执行更新A1操作时,总是更新不成功,但是执行上面隐去的插入语句却是成功的,这是为什么,难道在游标里不能执行对其它表的操作????
测试了一下感觉好像和权限有关,表A的权限表B没有,但是我在数据库里把权限给了表B还是失败
展开
 我来答
xu3180497
2014-08-14 · TA获得超过1659个赞
知道小有建树答主
回答量:390
采纳率:66%
帮助的人:196万
展开全部

我这边执行你的存储过程操作是可以进行更新的,不知道你更新不了具体错误是什么?

修改前初始数据

执行 (在此我将你的A1,B1类型定义成了varchar)

update a set A1 = 'mmm' where c = '2'

提示两行受影响,说明B表也更新了。打开B表查看:

建议查看一下更新数据的定义类型,是否存在超出范围的情况,或者表存在其他的约束等现象。


经过将数据类型化为decimal再次测试后,找到了问题所在,原因在于这一行:

update qb.dbo.B set B1=@A where C= @C --B1=@A中间没有空格。

改为:

update qb.dbo.B set B1= @A where C= @C --B1= @A中间加一个空格。

问题得以解决:

update a set A1 = 6.6 where c = '2'

最后,值得注意的是,定义decimal类型时最好带上精度,不然会出现四舍五入的情况,declimal默认指的是decimal(18,0)

更多追问追答
追问
你好,刚试了一下在查询分析器里直接updateA表的A1数据,B表里的B1数据会自动更新,但是通过程序调用存储过程修改A1的数据B1就修改不了,这是为什么??
追答
你用的什么程序?什么平台?可以自己调试查看原因。是否是参数没有取到还是中间一些变量的值没有取到。
Andy_Sun321
2014-08-14 · TA获得超过1376个赞
知道小有建树答主
回答量:811
采纳率:89%
帮助的人:727万
展开全部
游标里可以执行对其他数据表的操作, 不然你的insert语句也不会执行, 而是报错.
检查一下update的逻辑, 是否是条件不符合所以未能更新;
另外, 这里似乎可以不用游标, 直接update from就可以的.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式