4

いくつか読んだ後、複数のプロシージャがグローバル変数を変更できることが明らかになりました@@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'.

複数の同時カーソルが互いに踏み込まないようにする別の方法はありますか? それともここで頑張りすぎ?

4

1 に答える 1

0

解決策は、ステートメント@@FETCH_STATUSの直後に確認することです。FETCH NEXT特に、ステータスを変更する可能性のある呼び出しが介在していないことを確認してください。必要に応じて、宣言されたローカル変数に値を保存できます。「ほとんどすぐに」ステータスを確認するとおっしゃいました。よくわからない場合は、コードを確認してください。

そうで@@FETCH_STATUSなければ、信頼できるはずです。

于 2014-03-20T19:35:55.157 に答える