Sql server SQL Server 2016更改对象所有者

Sql server SQL Server 2016更改对象所有者,sql-server,sql-server-2016,Sql Server,Sql Server 2016,我继承了一个SQL 2008数据库,其中所有对象的前缀都是作为所有者的开发人员的名称,即ownername.sp_get_all_users 我已将数据库恢复到SQL Server 2016 Express Edition上 有几百个数据库对象,有没有一种方法可以自动将对象所有者更改为dbo,而不是手动编辑每个对象 我尝试了以下方法,但显然,自SQLServer2005以来,您无法再对对象进行特殊更改了 SELECT * from sysobjects where uid = user_id('

我继承了一个SQL 2008数据库,其中所有对象的前缀都是作为所有者的开发人员的名称,即ownername.sp_get_all_users

我已将数据库恢复到SQL Server 2016 Express Edition上

有几百个数据库对象,有没有一种方法可以自动将对象所有者更改为dbo,而不是手动编辑每个对象

我尝试了以下方法,但显然,自SQLServer2005以来,您无法再对对象进行特殊更改了

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
非常感谢您的帮助。

请使用此sp\u changeobjectowner

正如这里所解释的

例如: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

假设您已经测试过了,那么您对开发人员拥有的对象进行循环的一般想法是一个好主意。我建议改用ALTER AUTHORIZATION命令

您必须使用ALTER Schema

ALTER SCHEMA oldschemaname TRANSFER dbo.Address; 
要在下面自动使用

这将把所有具有除system以外的模式的表都更改为dbo,请注意,如果在不同的模式中有两个表,则它们不能存在于同一个模式中

sp_根据文档状态更改对象所有者

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


除上述建议外,SPs的所有者发生了以下变化:

  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

我还避免使用sp_msforeachtable——它不受支持,甚至没有文档记录。您的代码当前还将尝试移动系统中的每个表,而不管它当前在哪个模式中。谢谢@AaronBertrand@TheGameiswar我更新了我的答案,以反映你所指出的。SP在2012年仍然适用于我,但你的方法是正确的。希望我的答案现在仍然有价值。这是一个漫长的一周,在正确的数据库上运行你的SQL,就像我之前的想法一样。非常感谢。
  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