web-dev-qa-db-ja.com

SQL Server 2005では、データを失うことなくテーブルの「スキーマ」を変更するにはどうすればよいですか?

「db_owner」スキーマに入るテーブルがあり、「dbo」スキーマで必要です。

切り替えるために実行するスクリプトまたはコマンドはありますか?

72
DevelopingChris

SQL Server Management Studioの場合:

  1. テーブルを右クリックして変更を選択します(現在は「デザイン」と呼ばれています)
  2. プロパティパネルで、正しい所有スキーマを選択します。
80
Jason Punyon
ALTER SCHEMA [NewSchema] TRANSFER [OldSchema].[Table1]
83

すべて表示する 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
12

簡単な答え

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

データベースへのすべての接続を停止する必要はありません。これはオンザフライで実行できます。

7
Jeremy

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管理スタジオまたはVisual Studioのデータ転送を取得しようとして数時間を費やしました...新しいサーバーにダンプして、希望どおりに物事を取得します。

5
Lanceomagnifico

SQL Management Studioを使用すると、「変更」オプションは表示されず、「デザイン」または「編集」のみが表示されます。 Visual Studioを使用している場合(VS.NET 2003、2005、2008をチェック済み)、サーバーエクスプローラーを使用してスキーマを変更できます。テーブルを右クリックし、「テーブルの設計」(2008)または「テーブル定義を開く」(2003、2005)を選択します。完全な「列名」列を強調表示します。次に、右クリックして[プロパティページ]または[プロパティ(2008)]を選択します。プロパティシートから、「Owner」(2003および2005)または「Schema」(2008)が表示され、可能なスキーマのドロップダウンリストが表示されます。

4
Anthony K

これは、テーブルの束が異なるスキーマ(この場合は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 )
;
2
Oliver