找不到该对象,因为它不存在或者您没有权限,SQL Server中的错误

Emb*_*rja 47 sql-server

我有一个数据库,并有一个SQL脚本,在数据库的"产品"表中添加一些字段.

但是当我执行此脚本时,我收到以下错误:

Cannot find the object "Products" because it does not exist or you do not have permissions
Run Code Online (Sandbox Code Playgroud)

为什么会出现错误,我该怎么做才能解决它?

小智 72

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

TRUNCATE TableName

由于TRUNCATE删除没有记录的项目,您(显然)需要提升权限才能执行包含它的存储过程.我们将声明改为:

从TableName中删除

......错误消失了!

  • 这应该记录为SQL Server错误.错误消息是"找不到对象x ...",但问题与不同于x的对象的权限有关.不,错误消息不是"找不到对象x,因为它不存在.或者,您没有权限.".尽管该不存在的错误消息可能会提供更多线索,但它仍然没有指示具有权限问题的正确对象的错误消息. (4认同)
  • 截断语句对我来说也是一个问题。添加适当的权限以进行截断修复了该问题。 (3认同)

Jus*_*tin 62

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

USE SomeDatabase
Run Code Online (Sandbox Code Playgroud)


mar*_*c_s 8

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

select top 1 * from products
Run Code Online (Sandbox Code Playgroud)

你得到任何输出?

如果是:该用户是否具有修改表的权限,即执行DDL脚本ALTER TABLE等?通常,常规用户没有此提升权限.


Cri*_*k3t 8

查找脚本中的任何 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;
Run Code Online (Sandbox Code Playgroud)


ayo*_*rgo 7

也可能由于引用表[dbo.Product]而不是时出现错字[dbo].[Product]


Ram*_*Ram 5

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

解决此问题的步骤

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

突出显示的部分是架构名称

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

您可以参考“SQL Server 中的所有权和用户架构分离”