【问题标题】:Cannot find the object "XXX" because it does not exist or you do not have permission找不到对象“XXX”,因为它不存在或您没有权限
【发布时间】:2010-12-08 18:19:34
【问题描述】:

调用存储过程时出现以下错误:

找不到对象“XXX”,因为它不存在或您没有权限。

我已经检查了数据库,并且 SP 具有正确的权限,但我仍然收到错误消息。

有什么建议吗?

【问题讨论】:

    标签: sql-server stored-procedures permissions


    【解决方案1】:

    您在调用存储过程时使用的帐户不能与您用于检查它的帐户相同。确保您用于执行存储过程的帐户有权访问该对象。

    【讨论】:

    • Web 应用程序正在模拟一个可以访问存储过程的域用户。系统中使用的所有其他存储过程都是这种情况(超过 250 个其他存储过程)。只有这个是问题所在。我尝试重新分配权限但没有成功。
    【解决方案2】:

    在创建和访问对象时始终使用dbo.(或其他架构)前缀。

    我最近写过这个话题:

    【讨论】:

    • 存储过程是使用 dbo 架构前缀创建的,我通过 Microsoft 应用程序块访问它,这算吗?
    • 抱歉,我不知道“Microsoft 应用程序块”是什么。有没有办法告诉它调用“dbo.ProcedureName”而不仅仅是“ProcedureName”?
    【解决方案3】:

    以及关于架构/安全等的其他答案:

    • 你在某处有拒绝吗?
    • 区分大小写的对象名称和使用“错误”名称?
    • 错误的数据库上下文?例如 OtherDB.dbo.Myproc

    【讨论】:

      【解决方案4】:

      好的,这就是发生的事情。在 SP 结束之前有一个特殊字符,所以它不完整但仍然有效,不知何故。

      所以我可以看到 SP 并看到它的权限,但我无法运行它。因此,为了解决这个问题,我不得不将文本从 SQL Management Studio 中复制出来并粘贴到记事本中,然后删除特殊字符,然后将其复制并粘贴回 SQL Management Studio 并运行更改脚本。

      很奇怪这个角色是怎么到那里的!

      【讨论】:

        【解决方案5】:

        类似于标记答案: 我的存储过程的最后一行是授予存储过程以适当用户身份运行的权限的行 - 可能是在我生成脚本时添加的。

        删除那个(或者可能是附加的隐藏字符)设法修复它。

        “XXX”是我成功调用的存储过程的名称(它进行了所需的更改),但它给了我这个错误。

        【讨论】:

          【解决方案6】:

          我发现我在存储过程中遗漏了“END”之后的“GO”字样。更改 Proc 并添加回 GO 为我解决了这个问题。

          【讨论】:

            【解决方案7】:

            我也遇到了这个问题。就我而言,我在创建存储过程后授予了执行权限。并且两个语句之间没有“GO”。我添加了 GO,它可以工作。

            【讨论】:

              【解决方案8】:

              使用“GO”也为我解决了这个问题。这让我发疯了,在多次删除并检查用户和架构的权限之后,这就是最终的帮助。

              【讨论】:

                【解决方案9】:

                在 Microsoft SQL Server 中,在对象资源管理器中选择要使用的对象,右键单击它,然后执行“Script [object] as”可以为您提供成功执行操作所需的脚本而无需获取这个错误

                【讨论】:

                  【解决方案10】:

                  即使添加了“GO”,我也没有解决问题。然后删除 UPDATE STATISTICS [Table_name] 语句然后我的问题得到解决。

                  【讨论】:

                    【解决方案11】:

                    方案可能不同。如果有不同的方案,请将其添加到它的前面。

                    【讨论】:

                    • 这看起来很有帮助;您可以更新您的答案以包含一个示例吗?
                    【解决方案12】:

                    可能是拼写错误或已被删除?刷新您的视图或查询它(看起来这是一个存储过程):

                    SELECT name AS procedure_name   
                        ,SCHEMA_NAME(schema_id) AS schema_name  
                        ,type_desc  
                        ,create_date  
                        ,modify_date  
                    FROM sys.procedures; 
                    

                    然后,如果它已列出,请复制名称并尝试使用从这些结果中获取的名称进行查询(或以您可能熟悉的任何其他方式复制对象的名称)。

                    针对任何对象的更通用的解决方案(如果您有 SSMS): 在 SQL Server Management Studio 中,右键单击对象,“将 [OBJECT_TYPE] 编写为”,DROP To(或您正在尝试的操作),新建查询编辑器。

                    如果你能成功运行这个,你可能有一个错字。

                    【讨论】:

                      【解决方案13】:

                      如果在您的存储过程中有 SET IDENTITY ON & OFF 语句,那么您需要为用户登录添加 ddl_admin 权限。这是我的解决方案。

                      【讨论】:

                        猜你喜欢
                        • 2016-11-22
                        • 2015-05-27
                        • 2017-03-19
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2013-10-01
                        • 2013-04-09
                        相关资源
                        最近更新 更多