Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQL Server 2016 Change Object Owner

I've inherited a SQL 2008 dbase in which all of its objects are prefixed with the name of the developer as owner, i.e. ownername.sp_get_all_users.

I've restored the dbase onto SQL Server 2016 Express Edition.

There are several hundred dbase objects, is there a way to automate changing the object owners to dbo rather than manually editing each object?

I've tried the following but apparently you can no longer make ad-hoc changes to objects since 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

Any help most appreciated.

like image 706
David Geran Avatar asked Jun 14 '26 09:06

David Geran


2 Answers

You have to use Alter Schema...

ALTER SCHEMA oldschemaname TRANSFER dbo.Address; 

To Automate use below

this will change all tables which have a schema other than system to dbo,note if you have two tables in different schema,they can't exist in same schema

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 object owner as per documentation states..

This stored procedure only works with the objects available in MicrosoftSQL Server 2000. This feature will be removed in a future version of Microsoft SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use this feature. Use ALTER SCHEMA or ALTER AUTHORIZATION instead. sp_changeobjectowner changes both the schema and the owner. To preserve compatibility with earlier versions of SQL Server, this stored procedure will only change object owners when both the current owner and the new owner own schemas that have the same name as their database user names.

like image 168
TheGameiswar Avatar answered Jun 17 '26 02:06

TheGameiswar


Use this sp_changeobjectowner

As explained here MSDN

For example: EXEC sp_changeobjectowner 'YourObject', 'dbo'

You can use this to alter schema statement for newer 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
like image 39
Neo Avatar answered Jun 17 '26 02:06

Neo



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!