更改表所有者(Changing a table owner)

2019-07-31 10:07发布

我试图改变一个表的所有者:

sp_changeobjectowner 'OWNER.TABLENAME', 'dbo'

但是,当执行我得到的错误信息:

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

Answer 1:

要做到这一点在SQL Server 2005,上了正确的方法是停止思考的前缀为“老板”。 该sp_changeobjectowner过程 ,因为SQL Server 2005中已被弃用,你应该改为使用模式的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是不一样的对象,并使用不正确的大小写拼写它也可能导致该错误。



Answer 2:

你的说法正确的是:

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

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

EXEC sp_table_privileges '<tableName>'  


Answer 3:

SELECT 'Exec sp_changeobjectowner ''<CURRENTOWNER>.' + name + ''',  ''dbo''  '  FROM sys.objects WHERE type IN ('U','P','V','FN')

应用以下步骤

(1)运行继SQL查询提示(2)复制的结果,再粘贴到新的SQL查询并再次执行

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



Answer 4:

如果删除表是一个选项,您可以删除,并在所需的用户重新创建。 只要指定在创建脚本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


Answer 5:

为了弥补其中类似“共同”构建的架构名称中存在一个表的情况下(即不相关的用户名),那么它是架构所有者需要改变。

alter authorization on schema::Common TO dbo;

这将更改架构到指定的所有者“dbo”中的对象,并保持在“共同”表。

要列出模式所有者:

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;


文章来源: Changing a table owner