我正在尝试更改表的所有者:
sp_changeobjectowner 'OWNER.TABLENAME', 'dbo'
但是在执行时我收到错误消息:
消息 15001,级别 16,状态 1,过程 sp_changeobjectowner,第 62 行
对象 'OWNER.TABLENAME' 不存在或不是此操作的有效对象。
我正在尝试更改表的所有者:
sp_changeobjectowner 'OWNER.TABLENAME', 'dbo'
但是在执行时我收到错误消息:
消息 15001,级别 16,状态 1,过程 sp_changeobjectowner,第 62 行
对象 'OWNER.TABLENAME' 不存在或不是此操作的有效对象。
在 SQL Server 2005 及更高版本中执行此操作的正确方法是停止将前缀视为“所有者”。自 SQL Server 2005 以来,该sp_changeobjectowner
过程已被弃用,您应该改用schema DDL,例如:
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 拼写也可能导致此错误。
你的说法是正确的:
EXEC sp_changeobjectowner '<owner>.<tableName>', '<newOwner>'
如果发生错误,请尝试检查谁是表的当前所有者:
EXEC sp_table_privileges '<tableName>'
SELECT 'Exec sp_changeobjectowner ''<CURRENTOWNER>.' + name + ''', ''dbo'' ' FROM sys.objects WHERE type IN ('U','P','V','FN')
应用以下步骤
(1) 在 Sql Prompt 上运行以下查询 (2) 复制结果并再次粘贴到新的 Sql 查询并再次执行
这是您的表、视图、存储过程和函数的更改所有者
为了涵盖表存在于像“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;
如果删除表是一个选项,您可以删除并在所需用户下重新创建。只需在创建脚本中指定 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
运行以下查询 EXEC sp_changeobjectowner 'set here object name', 'set here new owner' go