Как изменить схему БД на dbo - PullRequest
111 голосов
/ 18 июля 2009

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

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

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

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

Ответы [ 10 ]

172 голосов
/ 18 июля 2009
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;

См. ALTER SCHEMA .

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

ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName; 
38 голосов
/ 18 июля 2009

Вы можете запустить следующее, что сгенерирует набор инструкций 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

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

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

20 голосов
/ 18 июля 2009
USE MyDB;
GO
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;
GO

Ссылка: ALTER SCHEMA

13 голосов
/ 08 мая 2013

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

 ALTER SCHEMA MySchema TRANSFER dbo.MyTable


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

 ALTER SCHEMA dbo TRANSFER MySchema.MyTable
8 голосов
/ 08 мая 2012

Я только что опубликовал это на похожий вопрос: В SQL Server 2005, как я могу изменить «схему» таблицы без потери каких-либо данных?


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

5 голосов
/ 03 декабря 2013

Вы можете пакетно изменить схемы нескольких объектов базы данных, как описано в этом посте:

Как изменить схему всех таблиц, представлений и хранимых процедур в MSSQL

2 голосов
/ 29 января 2015

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

ALTER SCHEMA dbo TRANSFER [DOMAIN\jonathan].MovieData;
2 голосов
/ 18 июля 2009

Способ сделать это для отдельной вещи:

изменить схему передачи данных dbo jonathan.MovieData

1 голос
/ 28 апреля 2015

Откройте SQL-сервер как учетную запись 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 голос
/ 18 июля 2009

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

ALTER SCHEMA имя_схемы TRANSFER имя_защищенного_

...