SQL Server 2008无法找到该对象

时间:2010-07-27 13:56:35

标签: sql-server sql-server-2008

我创建了许多表和存储过程。有一个登录名分配给具有执行权限的角色。对于除2个存储过程之外的所有存储过程,一切正常。但是,对于其中两个我收到以下错误:

  

Msg 15151,Level 16,State 1,   程序XX,第15行
  找不到了   对象'XX',因为它不存在   或者你没有得到许可。

我已检查过程是否存在,且该角色是否具有执行权限。如果我使用登录登录数据库,我可以看到程序并执行它,但是我在查询窗口的结果选项卡中得到结果,并在查询窗口的消息选项卡中显示错误。

我已经看了好几天了,没有到达任何地方。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

要检查几件事。

首先,如果数据库中有多个模式,最好确保在调用模式时使用模式。例如,如果您有一个名为Accounts的模式和一个名为AccountGet的proc,那么您应该使用exec accounts.AccountGet ..

其次,如果您的过程使用任何动态sql,那么调用用户将需要拥有这些表的适当权限,而不仅仅是该过程。

假设你有一个名为AccountGet的过程,它执行一个执行select的exec。您的用户需要有权执行AccountGet以及相关表格上的选择权限。

进行任何需要安全上下文的调用也是如此。传递当前正在执行的用户的上下文。如果该用户没有权限,那么您将获得权限错误。

答案 1 :(得分:1)

我发现了问题。我是从脚本创建过程的。我认为脚本中有一些奇怪的隐藏字符。我再次输入它并从那里重新创建它并且它工作得很好。这是一个非常奇怪的问题和一个误导性的错误信息。

答案 2 :(得分:1)

我遇到了同样的问题并找到了解决方案(对于我的情况): 我有一个GRANT EXECUTE ...语句遵循SQL代码来创建过程。 在程序代码之后但在GRANT语句解决问题之前添加GO语句。

说明:GRANT EXECUTE代码被解释为存储过程的一部分,因此没有权限GRANT此权限的用户收到上述错误消息。 sysadmin组的成员可以执行该过程而不会显示错误消息。但是只有执行该过程权限的用户才会收到错误消息。

我还注意到程序中的所有语句都已执行(通过在程序的不同位置插入print-Statments)。

我希望这有助于你们中的一些人: - )