【问题标题】:Cannot find the object because it does not exist or you do not have permissions. Error in SQL Server找不到该对象,因为它不存在或您没有权限。 SQL Server 中的错误
【发布时间】:2010-11-11 07:40:11
【问题描述】:

我有一个数据库,并且有一个 Sql 脚本可以将一些字段添加到数据库中名为“Products”的表中。

但是当我执行这个脚本时,我得到了以下错误:

Cannot find the object "Products" because it does not exist or you do not have permissions

为什么会发生错误,我应该怎么做才能解决它?

【问题讨论】:

  • 哪个是sql脚本?
  • 这可能与权限有关。用户是 db_owner 角色的成员吗?
  • 我在another string找到了我的案例的答案

标签: sql-server


【解决方案1】:

我找到了发生这种情况的原因。用户拥有适当的权限,但存储过程包含TRUNCATE 语句:

TRUNCATE TableName

由于TRUNCATE 在不记录的情况下删除项目,您(显然)需要提升权限才能执行包含它的存储过程。我们将语句更改为:

DELETE FROM TableName

...错误消失了!

【讨论】:

  • 截断语句对我来说也是一个问题。为 truncate 添加适当的权限修复了它。
  • 这应该被记录为 sql server 错误。错误消息是“找不到对象 x...”,但问题与不同于 x 的对象的权限有关。不,错误消息不是“找不到对象 x,因为它不存在。或者,您没有权限。”。尽管该不存在的错误消息可能会提供更多线索,但它仍然不如指示具有权限问题的正确对象的错误消息有用。
  • 这正是我的问题——我的本地用户运行良好,但在生产环境中没有使用服务帐户——谢谢!
  • 也修复了我的晦涩问题!谢谢!
  • 将数据库脚本从有问题的存储过程中取出来进行评估。我不认为这适用于我,但结果是我的脚本中的一个错误允许 GRANT EXEC 行包含在不应该存在的 sproc 本身中。哦。
【解决方案2】:

您确定要针对正确的数据库执行脚本吗?在 SQL Server Management Studio 中,您可以在其中一个工具栏上的下拉框中更改正在运行查询的数据库,或者您可以使用以下命令开始查询:

USE SomeDatabase

【讨论】:

  • +1 如果您使用 Azure Synapse 并打开一个 sql 脚本默认选择“内置”数据库,您需要将其更改为相关数据库(如果专用池从菜单中切换)
【解决方案3】:

这也可能是由于引用表时出现拼写错误,例如 [dbo.Product] 而不是 [dbo].[Product]。

【讨论】:

    【解决方案4】:

    您正在执行此脚本的用户是否看到该表?

    select top 1 * from products
    

    你有任何输出吗?

    如果是:该用户是否有权限修改表,即执行 DDL 脚本如ALTER TABLE 等?通常,普通用户没有这种提升的权限。

    【讨论】:

      【解决方案5】:

      也有可能是您在登录架构中创建了“产品”,而您试图在不同的架构(可能是 dbo)中执行相同的操作

      解决此问题的步骤

      1) 打开管理工作室 2)在资源管理器中找到对象并确定您的对象所在的架构? (它是您的对象名称之前的文本)。在下图中它的“dbo”和我的对象名称是动作状态

      如果你看到它像“yourcompanydoamin\yourloginid”那么你应该 您可以修改该特定架构的权限,而不是任何其他架构。

      您可以参考"Ownership and User-Schema Separation in SQL Server"

      【讨论】:

      • 我必须在我的数据库上下文类中添加一行,这样我才能访问在我的托管 sql 服务器中创建的表,即:modelBuilder.HasDefaultSchema("userteste");
      【解决方案6】:

      在脚本中查找任何 DDL 操作。 可能用户没有运行更改的访问权限。

      在我的例子中是SET IDENTITY_INSERT tblTableName ON

      您可以为整个数据库或仅为表添加db_ddladmin 来解决此问题(或更改脚本)

      -- give the non-ddladmin user INSERT/SELECT as well as ALTER:
      GRANT ALTER, INSERT, SELECT ON dbo.tblTableName TO user_name;
      

      【讨论】:

        【解决方案7】:

        您可以右键单击该过程,选择属性并查看授予您的登录 ID 哪些权限。然后,您可以手动检查“执行”并更改 proc 的权限。

        或者编写脚本是这样的:

        GRANT EXECUTE ON OBJECT::dbo.[PROCNAME]
            TO [ServerInstance\user];
        
        GRANT ALTER ON OBJECT::dbo.[PROCNAME]
            TO [ServerInstance\user];
        

        【讨论】:

        • 程序正在运行...问题是访问表,而不是程序。
        【解决方案8】:

        这可能是权限问题。用户至少需要 ALTER 权限才能截断表。 另一种选择是调用 DELETE FROM 而不是 TRUNCATE TABLE,但此操作较慢,因为它写入日志文件,而 TRUNCATE 不写入日志文件。

        所需的最低权限是对 table_name 的 ALTER。截断表 权限默认为表所有者,系统管理员的成员固定 服务器角色,以及 db_owner 和 db_ddladmin 固定数据库角色, 并且不可转让。但是,您可以合并 TRUNCATE 模块中的 TABLE 语句,例如存储过程,并授予 使用 EXECUTE AS 子句对模块的适当权限。

        【讨论】:

          【解决方案9】:

          我一直在尝试将表从 PROD 复制到 DEV,但出现错误: “找不到对象 X,因为它不存在或您没有权限。”

          但是,该表确实存在,并且我以 sa 身份运行,因此我确实拥有权限。

          问题实际上出在 CONTRAINTS 上。我已将 DEV 上的表重命名为 old_XXX 个月前。但是,当我尝试从 PROD 复制原始约束时,默认约束名称发生冲突。

          错误信息具有误导性

          【讨论】:

          • 您应该添加一些可重现的代码,以使您的答案易于理解。
          • 对不起,我只使用 SSIS GUI。有没有办法在没有一堆截图的情况下传达这一点?
          【解决方案10】:

          在我的情况下,我在与预期不同的用户下运行。

          我将'DRIVER={SQL Server};SERVER=...;DATABASE=...;Trusted_Connection=false;User Id=XXX;Password=YYY' 作为传递给pypyodbc.connect() 的连接字符串,但连接仍在使用运行脚本的Windows 用户的凭据(我使用SQL Server Profiler 并尝试了无效的uid 来验证这一点/password 组合 - 不会导致预期的错误)。

          我决定不再深入研究这个问题,因为切换到这种更好的连接方式可以解决问题:

          conn = pypyodbc.connect(driver='{SQL Server}', server='servername', database='dbname', uid='userName', pwd='Password')
          

          【讨论】:

            【解决方案11】:

            分享我的案例,希望对你有所帮助。

            在我MY_PROJ.Database->MY_PROJ.Database.sqlproj里面的情况下,我不得不这样说:

            <Build Include="dbo\Tables\MyTableGeneratingScript.sql" />
            

            【讨论】:

              【解决方案12】:

              在我的情况下,我的本地主机上的 sql server 版本高于生产服务器上的版本,因此一些新变量被添加到从本地主机生成的脚本中。这首先导致创建表时出错。 由于建表失败,后续对“NON EXISITING”表的查询也失败了。 幸运的是,在长长的 sql 错误列表中,我发现这个“OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF”是导致我的问题的脚本中的新变量。我进行了搜索和替换,错误消失了。 希望它可以帮助某人。

              【讨论】:

                【解决方案13】:

                TRUNCATE 语句是我的第一个问题,很高兴在这里找到解决方案。但是我正在使用 SSIS 并尝试从另一个数据库加载数据,并且在使用 IDENTITY 创建自动递增 ID 的任何表上都失败并出现相同的错误。如果我自己编写脚本,我首先需要使用命令 SET IDENTITY_INSERT tablename ON,然后 SET IDENTITY_INSERT tablename OFF 表更新完成时。但这需要表上的 ALTER 权限,而我没有。因此,SSIS 中有关表加载的错误消息(即使上一步刚刚删除了表中的所有数据。)

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-11-22
                  • 2015-05-27
                  • 2010-12-08
                  • 2017-03-19
                  • 1970-01-01
                  相关资源
                  最近更新 更多