SQL Server 2016更改对象所有者

时间:2016-11-18 15:05:59

标签: sql-server sql-server-2016

我继承了一个SQL 2008 dbase,其中所有对象的前缀都是开发者的名称,即ownername.sp_get_all_users。

我已将dbase恢复到SQL Server 2016 Express Edition。

有几百个dbase对象,有没有办法自动将对象所有者更改为dbo而不是手动编辑每个对象?

我尝试了以下内容,但显然自SQL Server 2005以来,您无法再对对象进行临时更改?

SELECT * from sysobjects where uid = user_id('UseNAme')
declare @Return int
exec @Return = sp_configure 'allow updates', '1'
SELECT @Return as 'Returned Code'
GO
reconfigure WITH OVERRIDE
GO
DECLARE @Rows int, @Error int
BEGIN TRANSACTION
update sysobjects set uid = user_id('dbo') where uid = user_id('UseNAme')
SELECT @Error = @@Error, @Rows = @@RowCount
SELECT @Rows as '#Rows'
IF @Rows > 0
 BEGIN  
  SELECT  @Rows AS '#Rows'
  COMMIT TRANSACTION
 END
else 
 BEGIN
  SELECT @Error AS 'Error #'
  ROLLBACK TRANSACTION
 END

exec sp_configure 'allow updates', '0'
reconfigure WITH OVERRIDE
go

最值得赞赏的任何帮助。

4 个答案:

答案 0 :(得分:3)

你必须使用Alter Schema ...

ALTER SCHEMA oldschemaname TRANSFER dbo.Address; 

自动使用以下

  

这会将所有具有系统以外架构的表更改为dbo,请注意,如果在不同架构中有两个表,则它们不能存在于同一架构中

select *,row_number() over (order by (select null)) as rownum
into #tables
 from information_Schema.tables
where table_schema in (select name  from sys.schemas
 where name  not in ('dbo','guest','INFORMATION_SCHEMA','sys') and principal_id <16384
 )

now move 
declare @min int,@max int

select @min=min(rownum),@max=max(rownum)
from #tables

declare @tblname varchar(255),@schemaname sysname
declare @sql varchar(max)

while @min<=@max
Begin

select @tblname=table_name,@schemaname=table_schema from
#tables where rownum=@min

set @sql='alter schema dbo transfer '+ @schemaname+'.'+@tblname

--print @sql
exec(@sql)

Set @min=@min+1
End

根据文档状态sp_change对象所有者..

  

此存储过程仅适用于MicrosoftSQL Server 2000中可用的对象。将在Microsoft SQL Server的未来版本中删除此功能。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。请改用ALTER SCHEMA或ALTER AUTHORIZATION。 sp_changeobjectowner更改架构和所有者。为了保持与早期版本的SQL Server的兼容性,当当前所有者和新所有者都拥有与其数据库用户名同名的模式时,此存储过程将仅更改对象所有者。

答案 1 :(得分:1)

使用此sp_changeobjectowner

如此处MSDN

所述

例如:EXEC sp_changeobjectowner 'YourObject', 'dbo'

您可以使用它来更改较新SQL Server DBS的架构语句

declare @sql varchar(8000), @table varchar(1000), @oldschema varchar(1000), @newschema   varchar(1000)

  set @oldschema = 'dbo'
  set @newschema = 'exe'

 while exists(select * from sys.tables where schema_name(schema_id) = @oldschema)

  begin
      select @table = name from sys.tables 
      where object_id in(select min(object_id) from sys.tables where  schema_name(schema_id)  = @oldschema)

    set @sql = 'alter schema ' + @newschema + ' transfer ' + @oldschema + '.' + @table

   exec(@sql)
 end

答案 2 :(得分:0)

循环浏览开发人员所拥有的对象的一般想法是一个好主意(假设你已经测试过了它)。我建议使用ALTER AUTHORIZATION命令代替MSDN Doc

答案 3 :(得分:0)

除了上述建议外,以下内容还会更改SP的所有者:

  Declare @sql varchar(8000),
        @table varchar(1000),
        @oldschema varchar(1000),
        @newschema   varchar(1000)

  set @oldschema = 'developername'
  set @newschema = 'dbo'

 while exists(select * from information_schema.routines where routine_type = 'PROCEDURE' and routine_schema = @oldschema )

  begin
      select @table = SPECIFIC_NAME from information_schema.routines 
      where SPECIFIC_NAME in(select SPECIFIC_NAME from information_schema.routines where routine_type = 'PROCEDURE' and routine_schema = @oldschema)

    set @sql = 'alter schema ' + @newschema + ' transfer ' + @oldschema + '.' + @table

   exec(@sql)
 end