存储过程不存在,是吗?

Posted

技术标签:

【中文标题】存储过程不存在,是吗?【英文标题】:Stored Procedure doesn't exist, or does it? 【发布时间】:2011-06-25 23:10:01 【问题描述】:

我遇到了问题:

我有一个运行存储过程的数据库连接。这个相同的连接用于之前创建所述存储过程。

稍后当我尝试调用给定的存储过程时,我收到以下消息:

找不到存储过程 'dbo.yaf_prov_upgrade'。

问题是它确实存在于数据库中。而且它还显示在 SQL Server Profiler 上。

RPC:已完成执行 [dbo].[yaf_prov_upgrade] @PreviousVersion=46,@NewVersion=46 .Net SqlClient 数据 提供者 Nico 矩阵\Nico

我想知道一个特定查询会抛出这样一个异常的原因是什么,即使它存在,它被调用,并且调用到达数据库。

连接不会有问题,因为它已经执行了其他存储过程。程序不会有问题,因为它确实存在,实际上是同一个应用程序,同一个网页,创建它并将其放在那里。

更新:忘了提及我使用的是集成安全性,并且我确实使用与应用程序连接的同一用户在数据库上运行 SP,并且运行它没有问题。

那么可以是什么?

【问题讨论】:

【参考方案1】:

您的 RPC 已完成仅表示提交到 SQL Server 的批处理是正确且已完成的。这并不意味着存储过程运行正常。

是(不要争论,检查)以下之一:

权限错误 错误的数据库上下文 错误的服务器 存储的过程在不同的数据库中

为了确保事情是一样的

SELECT
   @@SERVERNAME, 
   SUSER_SNAME(), 
   DB_NAME(), 
   USER_NAME(), 
   OBJECT_ID('dbo.yaf_prov_upgrade')

如果存储过程不存在该数据库中或者您没有权限,则 OBJECT_ID 将为 NULL。

【讨论】:

嗯,问题是我使用了两个数据库,一个用于会员资格,另一个用于论坛,我将它们合并并且它有效,我没有测试你的查询,但我假设你'是对的 @Nico:我们时不时会发生这种事情。现在您已经确定“错误的数据库上下文”,无需运行查询【参考方案2】:

我怀疑这可能是权限问题,请检查您的程序正在执行的用户名是否对存储的过程具有执行权限。

【讨论】:

是的,我认为这也可能是问题所在。但我看不到如何,我正在使用集成安全性,一切都是本地的,我检查过,我确实有足够的权限来自己执行 proc。 只需仔细检查您的程序用户名是否具有运行权限,即不要假设程序使用与您的登录名相同的用户名等。通常是非常简单和愚蠢的事情......面对 -在这种情况下遇到手掌错误。 我正在使用集成安全性,这意味着连接的用户是登录到我的计算机的用户,这与我在数据库上使用的登录名相同。连接字符串为<add name="yafnet" connectionString="Data Source=.\sqlexpress;Initial Catalog=dnforum;Integrated Security=True" />【参考方案3】:

到目前为止,我还不是 ms-sql 方面的专家,但我知道它将 SP 保存在全局缓存中。本地连接是否有可能仅在连接时获取全局 SP 列表?也许重新初始化连接或重新选择缓存?

【讨论】:

重新初始化连接是什么意思?我尝试了很多次,连接已重新启动多次。 是的,我就是这个意思。再说一次,对 C# 的了解不多,我更像是一个 php/mysql 类型的人,但看起来你正在调用一个数据库对象,然后是一个 SP 名称。是对的吗? C# db 对象是否需要 SP 名称前面的数据库引用?所以像 dbo.databasename.spname

以上是关于存储过程不存在,是吗?的主要内容,如果未能解决你的问题,请参考以下文章

如果存储过程尚不存在,则创建它,但不要更改也不要删除现有的存储过程

sqlserver2005 表A跟存储过程B存在依赖关系,我为表A添加了一列C,修改存储过程B时报错说列C不存在。

Oracle 存储过程 删除表记录时删除不存在的记录也是显示删除成功

存储过程如果存在不给出正确答案

即使我创建了存储过程也不存在

创建存储过程后红移游标不存在