39

最近、データベース サーバーに問題があり、長い努力の末、データベース サーバーを変更することにしました。そのため、データベースを別のサーバーに復元したり、接続文字列を変更したりしました。Web ブラウザーから Web サイトにアクセスしようとするまでは、すべてが計画どおりに進んでいました。

データベース オブジェクトが見つからないというエラーが発生し始めました。後で、スキーマ名が変更された結果として発生したことがわかりました。Kentico データベースには何百ものデータベース オブジェクト (テーブル、ビュー、およびストアド プロシージャ) があるため、それらすべてを手動で 1 つずつ変更することは現実的ではありません。これを行う実用的な方法はありますか?

4

4 に答える 4

105

はい、可能です。

データベース オブジェクトのスキーマを変更するには、次の SQL スクリプトを実行する必要があります。

ALTER SCHEMA NewSchemaName TRANSFER OldSchemaName.ObjectName

ObjectName には、テーブル、ビュー、またはストアド プロシージャの名前を指定できます。問題は、特定の shcema 名を持つすべてのデータベース オブジェクトのリストを取得しているようです。ありがたいことに、すべてのデータベース オブジェクトを格納する sys.Objects という名前のシステム テーブルがあります。次のクエリは、このタスクを完了するために必要なすべての SQL スクリプトを生成します。

SELECT 'ALTER SCHEMA NewSchemaName TRANSFER [' + SysSchemas.Name + '].[' + DbObjects.Name + '];'
FROM sys.Objects DbObjects
INNER JOIN sys.Schemas SysSchemas ON DbObjects.schema_id = SysSchemas.schema_id
WHERE SysSchemas.Name = 'OldSchemaName'
AND (DbObjects.Type IN ('U', 'P', 'V'))

ここで、タイプ「U」はユーザー テーブルを示し、「V」はビューを示し、「P」はストアド プロシージャを示します。

上記のスクリプトを実行すると、あるスキーマから別のスキーマにオブジェクトを転送するために必要な SQL コマンドが生成されます。このようなもの:

ALTER SCHEMA NewSchemaName TRANSFER OldSchemaName.CONTENT_KBArticle;
ALTER SCHEMA NewSchemaName TRANSFER OldSchemaName.Proc_Analytics_Statistics_Delete;
ALTER SCHEMA NewSchemaName TRANSFER OldSchemaName.Proc_CMS_QueryProvider_Select;
ALTER SCHEMA NewSchemaName TRANSFER OldSchemaName.COM_ShoppingCartSKU;
ALTER SCHEMA NewSchemaName TRANSFER OldSchemaName.CMS_WebPart;
ALTER SCHEMA NewSchemaName TRANSFER OldSchemaName.Polls_PollAnswer;

これで、これらの生成されたすべてのクエリを実行して、転送操作を完了することができます。

于 2013-07-10T12:56:44.383 に答える
8

データベース内のすべてのテーブル (複数のスキーマに分散) を "dbo" スキーマに移動するために実行した SQL は次のとおりです。

DECLARE 
    @currentSchemaName nvarchar(200),
    @tableName nvarchar(200)

DECLARE tableCursor CURSOR FAST_FORWARD FOR 
SELECT TABLE_SCHEMA, TABLE_NAME
FROM information_schema.tables
ORDER BY 1, 2

DECLARE @SQL nvarchar(400)

OPEN tableCursor 
FETCH NEXT FROM tableCursor INTO @currentSchemaName, @tableName

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @SQL = 'ALTER SCHEMA dbo TRANSFER ' + @currentSchemaName + '.' + @tableName
    PRINT @SQL

    EXEC (@SQL)

    FETCH NEXT FROM tableCursor INTO @currentSchemaName, @tableName
END

CLOSE tableCursor 
DEALLOCATE tableCursor 

ふぅ!

于 2015-05-29T13:52:23.153 に答える