我有一个数据库,并有一个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中删除
......错误消失了!
Jus*_*tin 62
您确定要对正确的数据库执行脚本吗?在SQL Server Management工作室中,您可以在其中一个工具栏的下拉框中更改运行查询的数据库,或者您可以使用以下命令启动查询:
USE SomeDatabase
Run Code Online (Sandbox Code Playgroud)
您正在执行此脚本的用户是否会看到该表?
select top 1 * from products
Run Code Online (Sandbox Code Playgroud)
你得到任何输出?
如果是:该用户是否具有修改表的权限,即执行DDL脚本ALTER TABLE
等?通常,常规用户没有此提升权限.
查找脚本中的任何 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)
也有可能您在登录架构中创建了“产品”,并且您试图在不同的架构(可能是 dbo)中执行相同的操作
解决此问题的步骤
1) 打开管理工作室 2) 在资源管理器中找到对象并确定您的对象所在的架构?(它是您的对象名称之前的文本)。在下面的图像中,它的“dbo”和我的对象名称是操作状态
如果您看到它类似于“yourcompanydoamin\yourloginid”,那么您应该可以修改该特定架构的权限,而不是任何其他架构。
您可以参考“SQL Server 中的所有权和用户架构分离”