我正在通过远程使用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);
由于Drop Procedure无效,我无法再次运行相同的SP(新会话)我的错误是:
已经有一个名为' firstProc3'在数据库中。
当我在服务器端提供 sp_help 时, 该表的行具有值
firstProc3测试存储过程
然而,当我给予 查询分析器中的DROP PROCEDURE test.firstProc3,该行将从表中删除。
尝试通过Junit执行相同操作可能会出现什么问题?
是否有权限设置?
PS - 用户测试启用了db_ddladmin。
答案 0 :(得分:1)
我设法通过使用以下方法最终解决了问题:
declare @object_id int
select @object_id = object_id('test.firstProc5')
EXEC sp_MSdrop_object @object_id
GO
这也是从表中删除数据。我能够多次成功运行Testcase!
感谢您的帮助:)
我提到的链接就在这里,希望它对某人有所帮助:
答案 1 :(得分:0)
根据错误消息,我怀疑这是一个权限问题。一些你的光标对象在你试图放弃时再次运行创建,或者你在再次运行单元测试之前从未真正丢弃过程,或者某些测试的逻辑顺序不合适时尚。您是否可以实例化一个新的游标对象并尝试使用它删除,或使用profiler或某些调试输出验证对数据库运行的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
答案 2 :(得分:0)
也许是小事,甚至可能不是这样,但你有没有试过在你的drop语句中使用转义?
类似
drop procedure [test].[firstProc3]
我记得当我从c#代码调用drop table时,我遇到了这个问题......