更改表所有者

时间:2012-09-06 14:34:35

标签: sql-server sql-server-2008

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

sp_changeobjectowner 'OWNER.TABLENAME', 'dbo'

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

  

Msg 15001,Level 16,State 1,Procedure sp_changeobjectowner,Line 62
  对象'OWNER.TABLENAME'不存在或不是有效对象   这个操作。

6 个答案:

答案 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';

还要确保正确拼写对象。例如,在区分大小写的排序规则中,TABLENAMEtablename不是同一个对象,使用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 '在此处设置对象名称'、'在此处设置新所有者' 去