У мене є таблиця, яка потрапила у схему "db_owner", і мені вона потрібна в схемі "dbo".
Чи існує сценарій або команда для запуску, щоб переключити його?
У мене є таблиця, яка потрапила у схему "db_owner", і мені вона потрібна в схемі "dbo".
Чи існує сценарій або команда для запуску, щоб переключити його?
Відповіді:
In SQL Server Management Studio:
ALTER SCHEMA [NewSchema] TRANSFER [OldSchema].[Table1]
OldSchema.Table1
на NewSchema.Table1
.
Показати все TABLE_SCHEMA
за допомогою цього вибору:
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
Ви можете використовувати цей запит, щоб змінити всю схему для всіх таблиць на схему таблиці dbo:
DECLARE cursore CURSOR FOR
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA <> 'dbo'
DECLARE @schema sysname,
@tab sysname,
@sql varchar(500)
OPEN cursore
FETCH NEXT FROM cursore INTO @schema, @tab
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'ALTER SCHEMA dbo TRANSFER ' + @schema + '.' + @tab
PRINT @sql
FETCH NEXT FROM cursore INTO @schema, @tab
END
CLOSE cursore
DEALLOCATE cursore
PRINT @sql
слід змінити наEXEC(@sql)
проста відповідь
sp_changeobjectowner [ @objname = ] 'object' , [ @newowner = ] 'owner'
не потрібно припиняти всі підключення до бази даних, це можна зробити на льоту.
Невелике поліпшення відмінного відповіді Саеіда в ...
Я додав exec для самостійного виконання цього коду і додав об'єднання вгорі, щоб міг змінити схему обох таблиць І збережених процедур:
DECLARE cursore CURSOR FOR
select specific_schema as 'schema', specific_name AS 'name'
FROM INFORMATION_SCHEMA.routines
WHERE specific_schema <> 'dbo'
UNION ALL
SELECT TABLE_SCHEMA AS 'schema', TABLE_NAME AS 'name'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA <> 'dbo'
DECLARE @schema sysname,
@tab sysname,
@sql varchar(500)
OPEN cursore
FETCH NEXT FROM cursore INTO @schema, @tab
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'ALTER SCHEMA dbo TRANSFER [' + @schema + '].[' + @tab +']'
PRINT @sql
exec (@sql)
FETCH NEXT FROM cursore INTO @schema, @tab
END
CLOSE cursore
DEALLOCATE cursore
Мені теж довелося відновити dbdump, і я виявив, що схема не є dbo - я годинами намагався змусити передати дані студії управління Sql Server або Visual Studio для зміни цільової схеми ... У підсумку я просто запустив це проти відновленої дамп на новий сервер, щоб отримати речі так, як я хотів.
Коли я використовую SQL Management Studio, я не отримую опцію "Змінити", лише "Дизайн" або "Редагувати". Якщо у вас Visual Studio (я перевірив VS.NET 2003, 2005 та 2008), ви можете скористатися Провідником сервера, щоб змінити схему. Клацніть правою кнопкою миші на таблиці та виберіть "Дизайн таблиці" (2008) або "Відкрити визначення таблиці" (2003, 2005). Виділіть повний стовпець "Назва стовпця". Потім можна клацнути правою кнопкою миші та вибрати «Сторінки властивостей» або «Властивості» (2008). На аркуші властивостей ви повинні побачити "Власник" (2003 та 2005) або "Схема" (2008) із випадаючим списком можливих схем.
Я використовую це для ситуацій, коли купа таблиць повинна бути в іншій схемі, в даному випадку схемі dbo.
declare @sql varchar(8000)
;
select
@sql = coalesce( @sql, ';', '') + 'alter schema dbo transfer [' + s.name + '].[' + t.name + '];'
from
sys.tables t
inner join
sys.schemas s on t.[schema_id] = s.[schema_id]
where
s.name <> 'dbo'
;
exec( @sql )
;
По-перше, потрібно зупинити всі підключення до бази даних, змінити право власності на таблиці, які є "db_owner", виконавши команду
sp_MSforeachtable @command1="sp_changeobjectowner ""?"",'dbo'"
де? - це назва таблиці.