Как изменить схему 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.