いくつか読んだ後、複数のプロシージャがグローバル変数を変更できることが明らかになりました@@Fetch_Status
。1 時間ごとに他のストアド プロシージャを呼び出すストアド プロシージャがあります (テーブル ドリブン トリガーのようなものです。このようにして、クライアントは制御を取得しますが、1 つのトリガーだけに触れる必要はありません)。したがって、これらの子プロシージャを呼び出すこの親プロシージャは、カーソルを使用します。子プロシージャの中には、カーソルも使用できるものがあります。
私はすべてFetch Next
の呼び出しの直後に呼び出しが続くことを知っていますが、並行して起こっていることで、特にここの備考セクションを考慮すると、@@Fetch_Status
呼び出し@@Fetch_Status
がスレッドセーフであるかどうかはわかりませんでした。だから、すべての呼び出しを次のようなものに置き換えるのは素晴らしいアイデアだと思いました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'.
複数の同時カーソルが互いに踏み込まないようにする別の方法はありますか? それともここで頑張りすぎ?