web-dev-qa-db-ja.com

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

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

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

現在の結果:jonathan.MovieData

望ましい結果:dbo.MovieData

112
jonathan hall
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;

ALTER SCHEMA を参照してください。

一般化された構文:

ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName; 
172
Remus Rusanu

以下を実行すると、すべてのタルブに対して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

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

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

38
patmortech
USE MyDB;
GO
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;
GO

参照: ALTER SCHEMA

20
Mitch Wheat

テーブルをdboスキーマからMySchemaに移動:

 ALTER SCHEMA MySchema TRANSFER dbo.MyTable


MySchemaからdboスキーマへのテーブルの移動:

 ALTER SCHEMA dbo TRANSFER MySchema.MyTable
13
Neru-J

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


slightsAeidの優れた答えの改善...

このコードを自己実行させるために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のデータ転送を取得しようとして数時間費やしました...新しいサーバーにダンプして、希望どおりに物事を取得します。

8
Lanceomagnifico

この投稿で説明されているように、複数のデータベースオブジェクトのスキーマをバッチ変更できます。

MSSQLのすべてのテーブル、ビュー、ストアドプロシージャのスキーマを変更する方法

5
anar khalilov

個々のことを行う方法:

変更スキーマdbo転送jonathan.MovieData

2
Jon Onstott

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

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

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
Mehdi Jalal