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还是失败 展开
下面是我写的代码
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还是失败 展开
展开全部
我这边执行你的存储过程操作是可以进行更新的,不知道你更新不了具体错误是什么?
修改前初始数据
执行 (在此我将你的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就修改不了,这是为什么??
追答
你用的什么程序?什么平台?可以自己调试查看原因。是否是参数没有取到还是中间一些变量的值没有取到。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询