2

JUnit を使用してリモートでストアド プロシージャを作成およびテストしています。ユーザー名は test で、これが私のコードです。

String sql = "create procedure test.firstProc3 AS select GETDATE()";
cursor.execute(sql);
cursor.executeQuery("firstProc3");

そして、プロシージャを削除するには:

String dropSQL = "DROP PROCEDURE test.firstProc3";
cursor.execute(dropSQL);

ドロップ手順が機能していないため、同じ SP を 2 回目に実行できません (新しいセッション) エラーは次のとおりです。

データベースには、'firstProc3' という名前のオブジェクトが既に存在します。

サーバー側でsp_helpを指定すると、テーブルに値の行がありました

firstProc3 テスト ストアド プロシージャ

ただし、クエリ アナライザーで DROP PROCEDURE test.firstProc3 を指定すると、行がテーブルから削除されます。

Junit を介して同じ操作を実行しようとすると、何が問題になる可能性がありますか?

設定する権限はありますか?

PS - ユーザー テストでは db_ddladmin が有効になっています。

4

3 に答える 3

1

私は最終的に以下を使用して問題を解決することができました:

declare @object_id int
select @object_id = object_id('test.firstProc5')
EXEC sp_MSdrop_object @object_id
GO

これにより、テーブルからデータも削除されます。テストケースを複数回正常に実行できます。

ご協力いただきありがとうございます :)

私が参照したリンクはここにあります、それが誰かを助けることを願っています:

http://www.mssqlcity.com/Articles/Undoc/SQL2000UndocSP.htm

于 2012-08-03T05:12:36.907 に答える
0

エラー メッセージに基づいて、権限の問題ではないかと思います。ドロップしようとしているときにカーソルオブジェクトが作成を再度実行しているように見えます。または、ユニットテストを再度実行する前にprocを実際にドロップしていないか、何らかの方法でテストが論理的な順序で実行されていません。新しいカーソル オブジェクトをインスタンス化してドロップを試すか、プロファイラーまたはデバッグ出力を使用してデータベースに対して実行されている SQL を確認できますか?

それを超えて、SQLコマンドを変更してprocの存在を確認するとエラーが解消されるかどうかを知りたいです(これが正しい答えではありません):

if object_id('test.firstProc3') is null begin
    -- Dynamic SQL because create must be first in a batch
    exec ('create procedure test.firstProc3 as select getdate()') 
end

if object_id('test.firstProc3') is not null begin
    drop procedure test.firstProc3
end
于 2012-08-02T14:12:59.540 に答える
0

何か小さなことかもしれませんし、そうではないかもしれませんが、drop ステートメントでエスケープを使用しようとしましたか?

何かのようなもの

drop procedure [test].[firstProc3]

C#コードからドロップテーブルを呼び出したときに、これに問題があったことを覚えています...

于 2012-08-03T10:07:03.487 に答える