У SQL Server 2005, як я можу змінити "схему" таблиці без втрати даних?


74

У мене є таблиця, яка потрапила у схему "db_owner", і мені вона потрібна в схемі "dbo".

Чи існує сценарій або команда для запуску, щоб переключити його?


5
Pedantry: *losing Please proofread.
GEOCHET

Відповіді:


84

In SQL Server Management Studio:

  1. Right click the table and select modify (it's called "Design" now)
  2. On the properties panel choose the correct owning schema.

6
дякую, смішно, якщо ви просто клацаєте правою кнопкою миші -> властивості, схема незмінна, тож я припустив, що це одне із завдань лише команд ніндзя. Радий знати, що це не так боляче, як відчувалося.
DevelopingChris

2
Модифікація може називатися дизайном залежно від використовуваної версії SQL Server Management Studio.
cjbarth

3
Якщо ви бачите лише вікно "Властивості стовпця". Перейдіть до Перегляд і виберіть "Вікно властивостей". Після редагування не забудьте зберегти зміни.
Jonas Äppelgran

84
ALTER SCHEMA [NewSchema] TRANSFER [OldSchema].[Table1]

Здається, це не перейменовує таблицю в SQL Server Management Studio з OldSchema.Table1на NewSchema.Table1.
Санчіт

3
Ви оновили список таблиць? Я виявив, що Management Studio, як правило, не оновлює список баз даних, щоб відображати зміни, виконані за допомогою tsql (на відміну від вибору таблиці та використання вбудованих інструментів), якщо ви не змусите це зробити. Або ви відключаєте / підключаєте знову.
Stephen Wrighton

Так. це, безумовно, просто візуальна річ, хоча SQL Server змушує мене вірити, що це не так. Після запуску вашої команди та оновлення та чого завгодно, якщо ви клацніть правою кнопкою миші на таблиці у вікні проектування, а потім у вікні властивостей зміните схему з oldSchema на newSchema, тоді вона оновить назву таблиці (разом із попереджувальним повідомленням). Я просто сподіваюся, що це робить графічний інтерфейс, еквівалентний вашій команді, а не щось зовсім інше. Чи є спосіб перевірити?
Санчіт

12

Показати все 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

1
Це чудово працює. Зверніть увагу, що PRINT @sqlслід змінити наEXEC(@sql)
tharen

7

проста відповідь

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

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


1
Технічно так. Це все ще в Деналі, і чудово працює для того, що просив зробити OP. Вони завжди кажуть, що збираються його видалити, але ніколи цього не роблять.
Jeremy

5

Невелике поліпшення відмінного відповіді Саеіда в ...

Я додав 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 або Visual Studio для зміни цільової схеми ... У підсумку я просто запустив це проти відновленої дамп на новий сервер, щоб отримати речі так, як я хотів.


Чудова відповідь! +1 для включення процедур. Мій БД їх також містив. Є також системні об'єкти VIEWs і FUNCTIONs, які мають поле схеми. Але в моєму випадку всі вони були в схемі "dbo".
Сім

4

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


2

Я використовую це для ситуацій, коли купа таблиць повинна бути в іншій схемі, в даному випадку схемі 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 )
;

-3

По-перше, потрібно зупинити всі підключення до бази даних, змінити право власності на таблиці, які є "db_owner", виконавши команду

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

де? - це назва таблиці.


sp_changedbowner proc застарілий, а sp_MSforeachtable ненадійний, як і sp_MSforeachdatabase .. Я взяв до використання версію Бертрана
Олівер,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.