26

我正在尝试更改表的所有者:

sp_changeobjectowner 'OWNER.TABLENAME', 'dbo'

但是在执行时我收到错误消息:

消息 15001,级别 16,状态 1,过程 sp_changeobjectowner,第 62 行
对象 'OWNER.TABLENAME' 不存在或不是此操作的有效对象。

4

6 回答 6

52

在 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';

还要确保正确拼写对象。例如,在区分大小写的排序规则中,TABLENAMEtablename不是同一个对象,并且用 InCorrEcT CaSe 拼写也可能导致此错误。

于 2012-09-06T15:09:55.167 回答
7

你的说法是正确的:

EXEC sp_changeobjectowner '<owner>.<tableName>', '<newOwner>' 

如果发生错误,请尝试检查谁是表的当前所有者:

EXEC sp_table_privileges '<tableName>'  
于 2012-09-06T14:43:12.557 回答
1
SELECT 'Exec sp_changeobjectowner ''<CURRENTOWNER>.' + name + ''',  ''dbo''  '  FROM sys.objects WHERE type IN ('U','P','V','FN')

应用以下步骤

(1) 在 Sql Prompt 上运行以下查询 (2) 复制结果并再次粘贴到新的 Sql 查询并再次执行

这是您的表、视图、存储过程和函数的更改所有者

于 2013-07-19T05:44:42.640 回答
1

为了涵盖表存在于像“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;
于 2016-11-24T02:48:12.863 回答
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
于 2014-04-21T19:32:30.620 回答
0

运行以下查询 EXEC sp_changeobjectowner 'set here object name', 'set here new owner' go

于 2021-03-15T09:08:11.477 回答