我正在使用JUnit通过远程创建和测试一个存储过程,我的用户名是test,这是我的代码,
String sql = "create procedure test.firstProc3 AS select GETDATE()";
cursor.execute(sql);
cursor.executeQuery("firstProc3");
ANd放弃程序:
String dropSQL = "DROP PROCEDURE test.firstProc3";
cursor.execute(dropSQL);
由于Drop过程不起作用,我无法第二次运行同一SP(新会话)我的错误是:
数据库中已存在名为"firstProc3"的对象。
当我在服务器端提供sp_help时,表中有一行的值为
firstProc3测试存储过程
然而,当我付出DROP PROCEDURE test.firstPoc3在查询分析器中,该行将从表中删除。
试图通过Junit进行同样的操作会有什么问题?
是否有要设置的权限?
PS-用户测试已启用db_ddladmin。
我使用以下方法最终解决了问题:
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
根据错误消息,我怀疑这是权限问题。当您尝试删除时,您的游标对象似乎正在再次运行create,或者在再次运行单元测试之前从未真正删除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
也许是一些小问题,也许事实并非如此,但您是否尝试在drop语句中使用转义?
类似的东西
drop procedure [test].[firstProc3]
我记得当我从c代码调用一个drop表时,我遇到了一个问题。。。