我正在尝试更改表的所有者:
sp_changeobjectowner 'OWNER.TABLENAME', 'dbo'
但是在执行时我收到错误消息:
Msg 15001,Level 16,State 1,Procedure sp_changeobjectowner,Line 62
对象'OWNER.TABLENAME'不存在或不是有效对象 这个操作。
答案 0 :(得分:46)
在SQL Server 2005及更高版本中执行此操作的正确方法是停止将前缀视为“所有者”。 {/ 3}}自SQL Server 2005以来已被弃用,您应该使用sp_changeobjectowner
procedure,例如:
ALTER SCHEMA dbo TRANSFER [current_owner].tablename;
检查当前的“所有者”(如果多个模式中有多个tablename
,则可能会返回多行):
SELECT s.name
FROM sys.schemas AS s
INNER JOIN sys.tables AS t
ON s.[schema_id] = t.[schema_id]
WHERE t.name = N'tablename';
还要确保正确拼写对象。例如,在区分大小写的排序规则中,TABLENAME
和tablename
不是同一个对象,使用InCorrEcT CaSe拼写它也可能导致此错误。
答案 1 :(得分:5)
您的陈述是正确的:
EXEC sp_changeobjectowner '<owner>.<tableName>', '<newOwner>'
如果发生错误,请尝试检查谁是该表的当前所有者:
EXEC sp_table_privileges '<tableName>'
答案 2 :(得分:1)
SELECT 'Exec sp_changeobjectowner ''<CURRENTOWNER>.' + name + ''', ''dbo'' ' FROM sys.objects WHERE type IN ('U','P','V','FN')
应用以下步骤
(1)在Sql Prompt上运行以下查询 (2)复制结果并再次粘贴到新的Sql查询并再次执行
这是表,视图,存储过程和函数的更改所有者
答案 3 :(得分:0)
如果删除表是一个选项,您可以删除并在所需用户下重新创建。只需在创建脚本中指定dbo即可。例如:
USE [X]
GO
/****** Object: Table [dbo].[TableName] Script Date: 4/21/2014 1:26:37 PM ******/
CREATE TABLE [dbo].[TableName](
[Field1] [bigint] NOT NULL,
[Field2] [nvarchar](50) NOT NULL,
[Field3] [datetime] NOT NULL
) ON [PRIMARY]
GO
答案 4 :(得分:0)
为了涵盖表格存在于诸如“Common”(与用户名无关)的构造模式名称中的情况,则需要更改模式所有者。
alter authorization on schema::Common TO dbo;
这会将架构中的对象更改为指定的所有者'dbo',并将表保留在'Common'中。
列出架构所有者:
select db_name() as Db,
sch.name as SchemaName,
u.Name as Owner
from sys.schemas sch
join sys.sysusers u
on u.uid = sch.principal_id;
答案 5 :(得分:0)
运行以下查询 EXEC sp_changeobjectowner '在此处设置对象名称'、'在此处设置新所有者' 去