2016-11-18 3 views
2

Я унаследовал базу данных SQL 2008, в которой все ее объекты имеют префикс имени разработчика как владельца, то есть имя_пользователя.sp_get_all_users.SQL Server 2016 Изменение владельца объекта

Я восстановил 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 

Любая помощь в оценке.

ответ

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 
0

Ваша общая идея прохождение через объекты, принадлежащие разработчику, является хорошей идеей (при условии, что у вас есть teste d heck из него). Я хотел бы предложить, используя ALTER AUTHORIZATION команды вместо MSDN Doc

3

Вы должны использовать Alter схему ...

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<[email protected] 
Begin 

select @tblname=table_name,@schemaname=table_schema from 
#tables where [email protected] 

set @sql='alter schema dbo transfer '+ @schemaname+'.'[email protected] 

--print @sql 
exec(@sql) 

Set @[email protected]+1 
End 

владелец объекта sp_change согласно документации состояний ..

Эта хранимая процедура работает только с объектами, имеющимися в MicrosoftSQL Server 2000. Эта функция будет удалена в будущей версии Microsoft SQL Server. Избегайте использования этой функции в новых разработках и планируйте изменять приложения, которые в настоящее время используют эту функцию. Вместо этого используйте ALTER SCHEMA или ALTER AUTHORIZATION. sp_changeobjectowner изменяет как схему, так и владельца. Чтобы сохранить совместимость с более ранними версиями SQL Server, эта хранимая процедура будет только изменять владельцев объектов, когда и текущий владелец, и новый владелец владеют схемами, которые имеют то же имя, что и имена пользователей базы данных.

+2

Я также избегаю 'sp_msforeachtable' - он не поддерживается и даже не документирован. Ваш код также будет пытаться переместить каждую отдельную таблицу в системе, независимо от того, в какой схеме она находится. –

+0

Спасибо @AaronBertrand – TheGameiswar

+0

@TheGameiswar Я обновил свой ответ, чтобы отразить то, что вы указали. SP все еще работает для меня в 2012 году, но ваш подход является правильным. надеюсь, мой ответ по-прежнему будет иметь ценность сейчас. –

0

В дополнение к вышеуказанному совету, следующие изменения владельца SPs:

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

набор @oldschema = 'developername' множество @newschema = 'ДБО'

в то время как существует (выберите * из information_schema.routines где routine_type = 'PROCEDURE' и routine_schema = @oldschema)

начинают выбора @table = SPECIFIC_NAME из information_schema.routines , где SPECIFIC_NAME в (выбрать SPECIFIC_NAME из information_schema.routines, где routine_type = 'ПРОЦЕДУРА' и routine_schema = @oldschema)

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

Exec (@sql) конечных

Смежные вопросы