69

我有一个数据库,并有一个 Sql 脚本来将一些字段添加到数据库中名为“产品”的表中。

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

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

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

4

13 回答 13

87

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

TRUNCATE TableName

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

DELETE FROM TableName

...并且错误消失了!

于 2013-08-15T15:13:34.463 回答
75

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

USE SomeDatabase
于 2009-07-16T10:27:28.493 回答
14

这也可能是由于在引用表格时出现拼写错误,例如[dbo.Product]代替[dbo].[Product].

于 2015-12-16T11:30:07.203 回答
9

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

select top 1 * from products

你有任何输出吗?

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

于 2009-07-16T10:39:31.730 回答
5

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

解决此问题的步骤

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

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

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

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

于 2015-12-04T10:10:46.580 回答
5

在脚本中查找任何 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;
于 2020-07-14T10:22:30.270 回答
2

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

或者编写脚本是:

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

GRANT ALTER ON OBJECT::dbo.[PROCNAME]
    TO [ServerInstance\user];
于 2013-06-13T16:13:04.403 回答
2

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

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

于 2019-06-07T18:57:47.983 回答
1

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

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

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

错误消息具有误导性

于 2017-07-02T23:24:24.943 回答
0

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

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

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

conn = pypyodbc.connect(driver='{SQL Server}', server='servername', database='dbname', uid='userName', pwd='Password')
于 2017-04-10T15:13:24.610 回答
0

分享一下我的情况,希望对你有帮助。

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

<Build Include="dbo\Tables\MyTableGeneratingScript.sql" />
于 2018-04-10T16:36:23.760 回答
0

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

于 2020-05-01T19:11:35.850 回答
0

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

于 2020-10-01T02:19:28.470 回答