dbスキーマをdboに変更するには


115

古いSQLサーバー(2000)から2008データベースに一連のテーブルをインポートしました。インポートされたすべてのテーブルには、ユーザー名のプレフィックスが付いています(例:)jonathan.MovieData。表propertiesにはjonathan、dbスキーマとしてリストされています。ストアドプロシージャを作成するときjonathan.、混乱を招くすべてのテーブル名の前に含める必要があります。

すべてのテーブルをジョナサンではなくdboに変更するにはどうすればよいですか?

現在の結果: 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

@PatricF 引用識別子の規則は、他の名前と同様にスキーマ名に適用されます[DOMAIN\user].[tableName]。一般に、SQL Serverコミュニティでは、Transact-SQLで引用された識別子が使用され([および])、"特定の要件がない限り避けてください。
Remus Rusanu 2016年

彼が私のすべてのテーブルを要求したので、これこれをチェックして単一のステートメントでそれを行うために、希望が誰かを助ける。
shaijut 2016

2
@leigeroは、SQLオブジェクト名を正確にしたい場合の他の場合と同様に、andを使用[]ます。[domain\user123].TableName
Remus Rusanu

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

このサイトから入手しました。

また、必要に応じて、ストアドプロシージャに対して同じことを行う方法についても説明します。


私は役に立たないように2番目のビットを試しましたが、リンクをありがとう、それを調べます。
ジョナサンホール

上記のINFORMATION_SCHEMA selectを使用して、すべてのALTER SCHEMAステートメントを自動的に生成できませんでしたか?
patmortech 2009

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

これを同様の質問に投稿しました。SQLServer 2005では、データを失うことなくテーブルの「スキーマ」を変更するにはどうすればよいですか。


わずか 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管理スタジオまたはビジュアルスタジオのデータ転送を取得するために何時間も費やしました...新しいサーバーにダンプして、思い通りの方法で取得します。


御馳走を働きます。ありがとう。
bgx



2

同様の問題がありましたが、スキーマにバックスラッシュが含まれていました。この場合、スキーマを角括弧で囲みます。

ALTER SCHEMA dbo TRANSFER [DOMAIN\jonathan].MovieData;

2

SAアカウントとしてSQL Serverを開き、以下のクエリを過ぎて新しいクエリをクリックします

次に[実行]をクリックすると、所有しているすべてのスキーマが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 seurable_name

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.