「db_owner」スキーマに入るテーブルがあり、「dbo」スキーマで必要です。
切り替えるために実行するスクリプトまたはコマンドはありますか?
SQL Server Management Studioの場合:
ALTER SCHEMA [NewSchema] TRANSFER [OldSchema].[Table1]
すべて表示する 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
簡単な答え
sp_changeobjectowner [ @objname = ] 'object' , [ @newowner = ] 'owner'
データベースへのすべての接続を停止する必要はありません。これはオンザフライで実行できます。
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のデータ転送を取得しようとして数時間を費やしました...新しいサーバーにダンプして、希望どおりに物事を取得します。
SQL Management Studioを使用すると、「変更」オプションは表示されず、「デザイン」または「編集」のみが表示されます。 Visual Studioを使用している場合(VS.NET 2003、2005、2008をチェック済み)、サーバーエクスプローラーを使用してスキーマを変更できます。テーブルを右クリックし、「テーブルの設計」(2008)または「テーブル定義を開く」(2003、2005)を選択します。完全な「列名」列を強調表示します。次に、右クリックして[プロパティページ]または[プロパティ(2008)]を選択します。プロパティシートから、「Owner」(2003および2005)または「Schema」(2008)が表示され、可能なスキーマのドロップダウンリストが表示されます。
これは、テーブルの束が異なるスキーマ(この場合は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 )
;