2011-07-18 20 views
11

テーブルに変更が加えられたときに、いくつかの監査タスクを実行するために使用されるトリガーがあります。このトリガーにはWHILEループがあり、ループ内には、ループの次の反復の前に宣言され、使用され、閉じられ、割り当てが解除されたカーソルがあります。名前のカーソルが既に存在する - SQL Server 2008

テーブルを変更するストアドプロシージャを呼び出すと、トリガが実行され、Management Studio内でこれを実行すると、すべて正常に動作します。

ただし、このストアドプロシージャがJava Webアプリケーション内から呼び出されると、「名前のカーソルが既に存在します」というエラーが表示されます。

このストアドプロシージャを手動で実行すると動作し、Webアプリケーションから実行すると機能しない理由はありますか?

+0

カーソルを持っており、whileループをリファクタリングする必要がトリガーされたトリガを試すことができます。このように、「LOCAL」キーワードを使用してカーソルを宣言します。 – HLGEM

答えて

28

GLOBALカーソルを使用しているようですが、このような問題が発生する可能性があります。

あなたは、カーソルを使用する必要がある場合:あなたは、すべてのコード内でLOCALカーソルを使用することができる場合

を。例:

DECLARE yourcursor CURSOR LOCAL ... 
+0

これは、マルチスレッドアプリケーションのカーソルに関する私の問題を修正しました。データベースオプションを使用してローカルにデフォルトに設定することもできます。 http://msdn.microsoft.com/en-us/library/ms188124(v=sql.105).aspx – Christian

4

複数のスレッドから呼び出されているように聞こえるので、2番目のスレッドがその名前を使用しようとすると、すでに存在します。名前のGUIDなどを使用して動的にカーソルの名前を付けてみてください。この方法はお勧めできません。

可能な限り集合ベースのアプローチを採用している場合は、トリガーコードからカーソルを削除することをお勧めします。トリガー内でカーソルを使用することのオーバーヘッドはかなり高くなければなりません。

6

ます。また、この

IF CURSOR_STATUS('global', 'Cursorname') >= -1 
BEGIN 
    CLOSE Cursorname 
    DEALLOCATE Cursorname 
END 
関連する問題