我有一个数据库,并有一个 Sql 脚本来将一些字段添加到数据库中名为“产品”的表中。
但是当我执行这个脚本时,我收到以下错误:
Cannot find the object "Products" because it does not exist or you do not have permissions
为什么会发生错误,我应该怎么做才能解决它?
我有一个数据库,并有一个 Sql 脚本来将一些字段添加到数据库中名为“产品”的表中。
但是当我执行这个脚本时,我收到以下错误:
Cannot find the object "Products" because it does not exist or you do not have permissions
为什么会发生错误,我应该怎么做才能解决它?
我找到了发生这种情况的原因。用户具有适当的权限,但存储过程包含一条TRUNCATE
语句:
TRUNCATE TableName
由于TRUNCATE
删除项目而不记录,您(显然)需要提升权限才能执行包含它的存储过程。我们将声明更改为:
DELETE FROM TableName
...并且错误消失了!
您确定您正在针对正确的数据库执行脚本吗?在 SQL Server Management Studio 中,您可以在其中一个工具栏上的下拉框中更改正在运行查询的数据库,或者您可以使用以下命令开始查询:
USE SomeDatabase
这也可能是由于在引用表格时出现拼写错误,例如[dbo.Product]
代替[dbo].[Product]
.
您正在执行此脚本的用户是否看到该表?
select top 1 * from products
你有任何输出吗?
如果是:该用户是否有权限修改表,即执行DDL脚本之类的ALTER TABLE
?通常,普通用户没有这种提升的权限。
您也可能在登录架构中创建了“产品”,并且您试图在不同的架构中执行相同的操作(可能是 dbo)
解决此问题的步骤
1)打开管理工作室 2)在资源管理器中找到对象并确定您的对象所在的架构?(它是您的对象名称之前的文本)。在下图中,它的“dbo”和我的对象名称是操作状态
如果您看到它像“yourcompanydoamin\yourloginid”,那么您应该可以修改该特定架构而不是任何其他架构的权限。
在脚本中查找任何 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;
您可以右键单击该过程,选择属性并查看授予您的登录 ID 哪些权限。然后,您可以手动检查“执行”并更改 proc 的权限。
或者编写脚本是:
GRANT EXECUTE ON OBJECT::dbo.[PROCNAME]
TO [ServerInstance\user];
GRANT ALTER ON OBJECT::dbo.[PROCNAME]
TO [ServerInstance\user];
这可能是权限问题。用户至少需要 ALTER 权限才能截断表。另一种选择是调用 DELETE FROM 而不是 TRUNCATE TABLE,但此操作较慢,因为它写入日志文件,而 TRUNCATE 不写入日志文件。
所需的最低权限是对 table_name 的 ALTER。TRUNCATE TABLE 权限默认授予表所有者、sysadmin 固定服务器角色成员以及 db_owner 和 db_ddladmin 固定数据库角色,并且不可转让。但是,您可以将 TRUNCATE TABLE 语句合并到模块(例如存储过程)中,并使用 EXECUTE AS 子句授予模块适当的权限。
我一直在尝试将表从 PROD 复制到 DEV,但出现错误:“找不到对象 X,因为它不存在或您没有权限。”
但是,该表确实存在,并且我以 sa 身份运行,因此我确实具有权限。
问题实际上出在 CONTRAINTS 上。我已将 DEV 上的表重命名为 old_XXX 个月前。但是当我试图从 PROD 复制原始的时,默认约束名称发生冲突。
错误消息具有误导性
在我的情况下,我在一个不同于我预期的用户下运行。
我有'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')
分享一下我的情况,希望对你有帮助。
在我的情况下,MY_PROJ.Database->MY_PROJ.Database.sqlproj
我不得不说:
<Build Include="dbo\Tables\MyTableGeneratingScript.sql" />
在我的情况下,我的本地主机上的 sql 服务器版本高于生产服务器上的版本,因此一些新变量被添加到从本地主机生成的脚本中。这首先导致创建表时出错。由于建表失败,后续对“NON EXISITING”表的查询也失败了。幸运的是,在长长的 sql 错误列表中,我发现这个“OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF”是导致我的问题的脚本中的新变量。我进行了搜索和替换,错误消失了。希望它可以帮助某人。
TRUNCATE 语句是我的第一个问题,很高兴在这里找到解决方案。但是我正在使用 SSIS 并尝试从另一个数据库加载数据,并且在使用 IDENTITY 创建自动递增 ID 的任何表上都失败并出现相同的错误。如果我自己编写脚本,我首先需要使用命令SET IDENTITY_INSERT tablename ON,然后 在表更新完成时使用SET IDENTITY_INSERT tablename OFF 。但这需要表上的 ALTER 权限,而我没有。因此,SSIS 中有关表加载的错误消息(即使上一步刚刚删除了表中的所有数据。)