在做了一些阅读后,很明显多个程序可以修改全局变量@@Fetch_Status
。我们有一个存储过程,每小时调用其他存储过程(类似于表驱动的触发器,这样客户端获得控制但没有必须触摸但只有一个触发器)。所以调用这些子程序的父程序使用游标。一些子程序也可以使用游标。
我知道每个Fetch Next
调用之后会立即进行@@Fetch_Status
调用,但事情并行发生我不确定调用@@Fetch_Status
是否是线程安全的,特别是考虑到备注部分here。因此,我认为将所有While @@Fetch_Status = 0)
次调用替换为
WHILE ( (SELECT fetch_status
FROM sys.dm_exec_cursors(0)
where name = 'server_cursor')=0) BEGIN
这在我的计算机上运行得很好但是当我将它移到客户端机器上时,我了解到我在sys.dm_exec_cursors(0)
表上没有选择权限。我收到错误The user does not have permission to perform this action.
。
或者,如果我尝试select * from sys.syscursors
,我会收到错误The SELECT permission was denied on the object 'syscursors', database 'mssqlsystemresource', schema 'sys'.
是否有另一种方法可以确保多个同时游标不相互踩?或者我在这里工作太辛苦了?
答案 0 :(得分:0)
解决方案是在@@FETCH_STATUS
语句后立即检查FETCH NEXT
。特别是,确保没有可能改变状态的干预呼叫。如有必要,可以将值保存到声明的局部变量。你提到检查状态"几乎立即"。如果您不确定,最好检查一下代码。
否则,@@FETCH_STATUS
应该可靠。