只剩最后50分了,请大家不要嫌弃,帮我看看这个触发器调用存储过程的问题,快疯了 ( 积分: 50 )

  • 主题发起人 主题发起人 qczyy
  • 开始时间 开始时间
Q

qczyy

Unregistered / Unconfirmed
GUEST, unregistred user!
CREATE TRIGGER T_UPDATE ON dbo.tableA
FOR UPDATE
AS
declare @vID varchar(6)
declare @cID varchar(12)
declare @iID varchar(15)
declare @PRICE FLOAT

IF UPDATE(P_PIZHUN_ZT) and not UPDATE(P_NIZHI_DATE)
BEGIN
insert PRICE_HISTORY -----写入日志表

select .......from tableA INNER JOIN INSERTED ON tableA.ID=INSERTED.ID

---------------调用远程存储过程
select @vID=vend_id,@cID=poct_id,@iID=itmi,@PRICE=price_nd from inserted where p_pizhun_zt='1'
if @@rowcount<>0
begin
exec SERVER1.dbtest.dbo.UPDATEprice @vID ,@cID,@IID,@PRICE
end

end



=============问题是单独调试这个存储过程是没问题的,在这个触发器里调用就有问题了,
没符合调用存储过程的记录时,原表和日志表更新正常,
当有符合条件的记录能调用存储过程时,运行失败,而且把日志表,原表都回滚了,
不知道怎么回事,请帮我看看啊,哭等

我要的结果是原表和日志表更新,当有符合条件的记录能调用存储过程时,正常运行该存储过程
 
CREATE TRIGGER T_UPDATE ON dbo.tableA
FOR UPDATE
AS
declare @vID varchar(6)
declare @cID varchar(12)
declare @iID varchar(15)
declare @PRICE FLOAT

IF UPDATE(P_PIZHUN_ZT) and not UPDATE(P_NIZHI_DATE)
BEGIN
insert PRICE_HISTORY -----写入日志表

select .......from tableA INNER JOIN INSERTED ON tableA.ID=INSERTED.ID

---------------调用远程存储过程
select @vID=vend_id,@cID=poct_id,@iID=itmi,@PRICE=price_nd from inserted where p_pizhun_zt='1'
if @@rowcount<>0
begin
exec SERVER1.dbtest.dbo.UPDATEprice @vID ,@cID,@IID,@PRICE
end

end



=============问题是单独调试这个存储过程是没问题的,在这个触发器里调用就有问题了,
没符合调用存储过程的记录时,原表和日志表更新正常,
当有符合条件的记录能调用存储过程时,运行失败,而且把日志表,原表都回滚了,
不知道怎么回事,请帮我看看啊,哭等

我要的结果是原表和日志表更新,当有符合条件的记录能调用存储过程时,正常运行该存储过程
 
原因在于你是调用的远程存储过程吧。
执行之前先要连接服务器(有相关命令),然后调用执行。
 
---------------调用远程存储过程
select @vID=vend_id,@cID=poct_id,@iID=itmi,@PRICE=price_nd from inserted where p_pizhun_zt='1'
if @@rowcount<>0
begin
exec SERVER1.dbtest.dbo.UPDATEprice @vID ,@cID,@IID,@PRICE
end

这里改为:
---------------调用远程存储过程
if Exists(select @vID=vend_id,@cID=poct_id,@iID=itmi,@PRICE=price_nd from inserted where p_pizhun_zt='1')
begin
exec SERVER1.dbtest.dbo.UPDATEprice @vID ,@cID,@IID,@PRICE
end

在触发器中真正应用时是不能返回结果集的,所以不能出现 select ....返回结果集的语法
用Exists函数吧
 
O。。 sorry 看错了
存在调用
exec SERVER1.dbtest.dbo.UPDATEprice @vID ,@cID,@IID,@PRICE
时提交失败,估计是跨服务器操作问题(如登录帐户等) 记的好像是SQL Server不支持这种跨服务器调用方法(但调试可以)
 
>>单独调试这个存储过程是没问题的
单独执行是同样语境下用代码执行的吗?还是手工执行?如果是手工执行,可能使用不同的
身份!
 
单独执行是指在TABLEA这个表所在的SQL SERVER的查询分析器里,执行
exec SERVER1.dbtest.dbo.UPDATEprice '参数1','参数2','参数3','参数4',

是可以运行的
 
试了一下把存储过程换成其他的语句,可以运行,换成本地服务器的存储过程也不行,看来是触发器里调用存储过程的方法不对,该怎么改正呢?
 
在触发器里使用过程是经常的,你的代码没错!
我猜测是权限不够!你进入查询分析器里使用的什么用户权限?你的程序连接数据库用的
是什么权限?
 
在触发器里使用过程是经常的,你的代码没错!
我猜测是权限不够!你进入查询分析器里使用的什么用户权限?你的程序连接数据库用的
是什么权限?
============
不是权限问题,两个是一样的权限。
我反复试了,发现是触发器里不能调用有参数的存储过程,有参数的就不行,奇怪
 
我经常在触发器里调用过程,都是带参数的!
问题可能就出在参数上!手工调用传入的是常量,代码中传入变量,是不是变量有什么问题?比如长度和类型
 
exec SERVER1.dbtest.dbo.UPDATEprice '参数1','参数2','参数3','参数4',
我在触发器里直接写明参数调试,不用变量做参数,还是不行,
如果换成不带参数的存储过程,就没问题
 
多人接受答案了。
 
后退
顶部