1

自動テストを実行するためのテストデータベースをセットアップしようとしています。理想的にはモックオブジェクトを使用する必要があることはわかっていますが、これは古いアプリであり、そうするのは簡単ではありません。データベースにロジックが多すぎます。

とにかく、十分な裏話。テストが既知のデータでロードできるクリーンなdbセットアップを取得しているので、結果も既知です。

テストの開始時に、.sqlスクリプトが実行されてテーブルが空になり、テストデータが入力されます。私が見ている問題は、データベース構造の同期を維持することではなく、データベース構造はあまり変更されないため(それもいいでしょうが)、すべてのプロシージャ/関数などを開発からテストに移動します。テスト。

これを行うために実行できるSQLコマンドはありますか?開発データベースからprocを読み取り、それをテストデータベースにコピーするには?

編集:私は実際にSQL管理オブジェクトの使用がかなりうまくいくことを発見しました。

唯一の問題は、誰かがアイテムの名前を変更した場合、内部参照がSQLサーバーによって更新されず、古い名前で作成されることです。これを修正する方法はありますか?

4

4 に答える 4

3

チャド、これであなたの探しているものがどれほど自動化されているかはわかりません。すべてのプロシージャを一度にスクリプト化する場合は、SQLEnterpriseManagerから実行できます。

各テストスクリプトの前に、CREATE用のDevからのすべてのプロシージャ。procをTESTにドロップし、devファイルからスクリプトを実行します。これにより、プロシージャが同期していることを確認できます。

于 2009-12-31T20:16:02.163 に答える
3

「データベース構造」の同期を維持することは問題ではないとおっしゃいましたが、その後、procs/functionsをdevからtestに移動する必要があると言いました。これらはデータベース構造の一部です!IAC、Red-GateのSQLCompareのようなツールをお勧めします。テストに存在しないdevに存在するデータベース構造を移動します。とても素敵なツール。私はそれを何年も使ってきました。

于 2009-12-31T20:03:08.073 に答える
1

ストアドプロシージャをあるデータベースから別のデータベースにコピーするために使用できる、手っ取り早いSQLスクリプトを次に示します。

USE DestinationDatabase

GO

DECLARE
    @SchemaName sysname,
    @ProcName nvarchar(4000),
    @ProcDefinition nvarchar(max),
    @DropSql nvarchar(4000)

SET @SchemaName = 'dbo'

DECLARE crProcedures CURSOR FAST_FORWARD FOR
    SELECT r.ROUTINE_NAME, r.ROUTINE_DEFINITION
    FROM SourceDatabase.INFORMATION_SCHEMA.Routines r
    WHERE ROUTINE_SCHEMA = @SchemaName
    AND ROUTINE_NAME IN ('Procedure1', 'Procedure2', 'Procedure3')
OPEN crProcedures
FETCH NEXT FROM crProcedures INTO @ProcName, @ProcDefinition
WHILE (@@FETCH_STATUS = 0)
BEGIN
    SET @DropSql = 'IF  EXISTS ' +
        '(SELECT * FROM sys.objects ' +
        'WHERE object_id = OBJECT_ID(N''' + @ProcName + ''') ' +
        'AND type in (N''P'', N''PC'')) ' +
        'DROP PROCEDURE ' + @ProcName
    EXEC sp_executesql @DropSql
    EXEC sp_executesql @ProcDefinition

    FETCH NEXT FROM crProcedures INTO @ProcName, @ProcDefinition
END
CLOSE crProcedures
DEALLOCATE crProcedures

とを混同しないように注意してください。混同しないSourceDatabaseDestinationDatabase、問題が発生します。

于 2009-12-31T20:22:32.647 に答える
0

SMOを使用すると、次のことがうまく機能します。そして、約40秒でコピーします。

    private static void CopyDBSchema(string sourceDBServer, string sourceDBName, string targetDBServer, string targetDBName)
    {
        Server server = new Server(sourceDBServer);
        server.SetDefaultInitFields(true);

        Database db = server.Databases[sourceDBName];
        Transfer t = new Transfer()
        {
            Database = db,

            CopyData = false,
            CopyAllObjects = false,
            CopyAllUsers = false,
            CopyAllLogins = false,

            CopySchema = true,
            CopyAllTables = true,
            CopyAllViews = true,
            CopyAllStoredProcedures = true,
            CopyAllDatabaseTriggers = true,
            CopyAllUserDefinedAggregates = true,
            CopyAllUserDefinedDataTypes = true,
            CopyAllUserDefinedFunctions = true,
            CopyAllUserDefinedTypes = true,

            DropDestinationObjectsFirst = true,
            UseDestinationTransaction = true,
            DestinationServer = targetDBServer,
            DestinationDatabase = targetDBName
        };

        t.Options.WithDependencies = true;
        t.Options.IncludeIfNotExists = true;
        t.Options.DriPrimaryKey = true;
        t.Options.DriForeignKeys = true;
        t.Options.DriIndexes = true;
        t.Options.DriNonClustered = true;
        t.Options.DriUniqueKeys = true;
        t.Options.DriAllKeys = true;
        t.Options.Triggers = true;

        t.TransferData();
        server = null;
    }
于 2009-12-31T22:37:06.593 に答える