В SQL Server 2005, как я могу изменить «схему» таблицы без потери каких-либо данных? - PullRequest
72 голосов
/ 18 сентября 2008

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

Есть ли скрипт или команда для его переключения?

Ответы [ 8 ]

82 голосов
/ 18 сентября 2008
ALTER SCHEMA [NewSchema] TRANSFER [OldSchema].[Table1]
80 голосов
/ 18 сентября 2008

В SQL Server Management Studio:

  1. Щелкните правой кнопкой мыши по таблице и выберите «изменить» (теперь она называется «Дизайн»)
  2. На панели свойств выберите правильную схему владения.
12 голосов
/ 01 февраля 2010

Показать все 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
7 голосов
/ 18 сентября 2008

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

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

вам не нужно останавливать все соединения с базой данных, это можно сделать на лету.

5 голосов
/ 08 мая 2012

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

4 голосов
/ 18 сентября 2008

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

2 голосов
/ 09 июня 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...