В sql server 2005, как мне изменить "схему" таблицы без потери каких-либо данных?

У меня есть таблица, которая попала в схему "db_owner", и мне это нужно в схеме "dbo".

Существует ли script или команда для ее запуска?

Ответ 1

В SQL Server Management Studio:

  • Щелкните правой кнопкой мыши таблицу и выберите вариант (теперь он называется "Дизайн" )
  • На панели свойств выберите правильную схему владения.

Ответ 2

ALTER SCHEMA [NewSchema] TRANSFER [OldSchema].[Table1]

Ответ 3

Показать все 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

Ответ 4

простой ответ

sp_changeobjectowner [ @objname = ] 'object' , [ @newowner = ] 'owner'

вам не нужно останавливать все подключения к базе данных, это можно сделать "на лету".

Ответ 5

A небольшое улучшение для лучшего ответа sAeid...

Я добавил 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 или визуальную передачу данных студии, чтобы изменить схему назначения... Я закончил работу с этим против восстановленного дампа на новом сервере, чтобы получить то, что я хотел.

Ответ 6

Когда я использую SQL Management Studio, я не получаю параметр "Изменить", только "Дизайн" или "Редактировать". Если у вас есть Visual Studio (я проверил VS.NET 2003, 2005 и 2008), вы можете использовать Server Explorer для изменения схемы. Щелкните правой кнопкой мыши по таблице и выберите "Таблица дизайна" (2008) или "Открыть таблицу определения" (2003, 2005). Выделите полное столбец "Название столбца". Затем вы можете щелкнуть правой кнопкой мыши и выбрать "Страницы свойств" или "Свойства" (2008). Из листа свойств вы должны увидеть "Владелец" (2003 и 2005) или "Схема" (2008) с выпадающим списком для возможных схем.

Ответ 7

Я использую это для ситуаций, когда куча таблиц должна быть в другой схеме, в данном случае схеме 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 )
;

Ответ 8

Сначала необходимо остановить все подключения к базе данных, изменить права собственности на таблицы, которые являются "db_owner", запустив команду

sp_MSforeachtable @command1="sp_changeobjectowner ""?"",'dbo'"

где? это имя таблицы.