Як змінити схему 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
Щоб заощадити час для Googlers: ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName;
Co7e

1
Якщо у користувача є зворотний нахил, виконайте наступне: ALTER SCHEMA dbo TRANSFER "ДОМАН \ користувач" .tableName
PatricF

@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).
Хайнзі


15

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

 ALTER SCHEMA MySchema TRANSFER dbo.MyTable


Перемістити таблицю з MySchema на схему dbo:

 ALTER SCHEMA dbo TRANSFER MySchema.MyTable

9

Я щойно опублікував це на подібне питання: На сервері sql 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 та натисніть на новий запит за поданими нижче запитами

потім натисніть на Execute, він відкаже всю схему, що належить, назад до облікового запису 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-help: //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.