Как изменить схему db на dbo


115

Я импортировал кучу таблиц со старого сервера sql (2000) в свою базу данных 2008 года. Все импортированные таблицы начинаются с моим именем, например: jonathan.MovieData. В таблице propertiesон указан jonathanкак схема db. Когда я пишу хранимые процедуры, мне теперь нужно включать jonathan.перед всеми именами таблиц, что сбивает с толку.

Как мне изменить все мои таблицы на dbo вместо jonathan?

Текущий результат: jonathan.MovieData

Желаемый результат: dbo.MovieData

Ответы:


179
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;

Смотрите ALTER SCHEMA .

Обобщенный синтаксис:

ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName; 

12
Чтобы сэкономить время сотрудников Google: ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName;
Co7e

1
Если у пользователя есть обратная косая черта, выполните следующее: ALTER SCHEMA dbo TRANSFER "DOMAIN \ user" .tableName
PatricF 02

@PatricF идентификаторы в кавычках правила применяются к именам схемы так же , как любое другое имя: [DOMAIN\user].[tableName]. Обычно в сообществе SQL Server используются идентификаторы в кавычках Transact-SQL ( [и ]), избегайте, "если для этого нет особых требований.
Ремус Русану

Поскольку Он попросил все мои таблицы , проверьте это и это, чтобы сделать это в одном утверждении, надежда поможет кому-то.
Shaijut

2
@leigero используйте [и ], как и в любом другом случае, если вы хотите уточнить имя объекта SQL. [domain\user123].TableName,
Ремус Русану

40

Вы можете запустить следующее, которое сгенерирует набор операторов ALTER sCHEMA для всех ваших талбов:

SELECT 'ALTER SCHEMA dbo TRANSFER ' + TABLE_SCHEMA + '.' + TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'jonathan'

Затем вам нужно скопировать и запустить операторы в анализаторе запросов.

Вот более старый сценарий, который, я думаю, сделает это за вас, изменив владельца объекта. Однако не пробовал в 2008 году.

DECLARE @old sysname, @new sysname, @sql varchar(1000)

SELECT
  @old = 'jonathan'
  , @new = 'dbo'
  , @sql = '
  IF EXISTS (SELECT NULL FROM INFORMATION_SCHEMA.TABLES
  WHERE
      QUOTENAME(TABLE_SCHEMA)+''.''+QUOTENAME(TABLE_NAME) = ''?''
      AND TABLE_SCHEMA = ''' + @old + '''
  )
  EXECUTE sp_changeobjectowner ''?'', ''' + @new + ''''

EXECUTE sp_MSforeachtable @sql

Получил с этого сайта .

В нем также говорится о том, чтобы сделать то же самое для сохраненных процессов, если вам нужно.


Второй бит пробовал безрезультатно, но спасибо за ссылку, разберусь.
джонатан холл

Разве вы не смогли использовать выбранный выше параметр INFORMATION_SCHEMA для автоматической генерации всех ваших операторов ALTER SCHEMA?
patmortech

Обратите внимание на следующую цитату из документации INFORMATION_SCHEMA.TABLES : « Важно ! Не используйте представления INFORMATION_SCHEMA для определения схемы объекта. Единственный надежный способ найти схему объекта - запросить представление каталога sys.objects». Таким образом, пример следует переписать, чтобы sys.tablesвместо него использовать (подмножество sys.objects).
Heinzi


15

Переместить таблицу из схемы dbo в MySchema:

 ALTER SCHEMA MySchema TRANSFER dbo.MyTable


Переместить таблицу из MySchema в схему dbo:

 ALTER SCHEMA dbo TRANSFER MySchema.MyTable

9

Я только что отправил это на аналогичный вопрос: как в sql server 2005 изменить «схему» таблицы без потери данных?


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

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


Работает удовольствие. Спасибо.
bgx



2

У меня была аналогичная проблема, но в моей схеме была обратная косая черта. В этом случае заключите схему в скобки.

ALTER SCHEMA dbo TRANSFER [DOMAIN\jonathan].MovieData;

2

Откройте SQL Server как учетную запись SA и щелкните новый запрос после следующих запросов.

затем нажмите «Выполнить», он откатит всю имеющуюся схему обратно в учетную запись SA.

alter authorization on schema::[db_datareader] to [dbo]
alter authorization on schema::[db_datareader] to [db_datareader]
alter authorization on schema::[db_datawriter] to [dbo]
alter authorization on schema::[db_datawriter] to [db_datawriter]
alter authorization on schema::[db_securityadmin] to [dbo]
alter authorization on schema::[db_securityadmin] to [db_securityadmin]
alter authorization on schema::[db_accessadmin] to [dbo]
alter authorization on schema::[db_accessadmin] to [db_accessadmin]
alter authorization on schema::[db_backupoperator] to [dbo]
alter authorization on schema::[db_backupoperator] to [db_backupoperator]
alter authorization on schema::[db_ddladmin] to [dbo]
alter authorization on schema::[db_ddladmin] to [db_ddladmin]
alter authorization on schema::[db_owner] to [dbo]
alter authorization on schema::[db_owner] to [db_owner]

1

мс-помощь: //MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/0a760138-460e-410a-a3c1-d60af03bf2ed.htm

ALTER SCHEMA schema_name TRANSFER securable_name

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.