我继承了一个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
最值得赞赏的任何帮助。
答案 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