0

別のグループが提供する複数の SQL Server 2008 データベースをホストしています。ときどき、データベースの 1 つの新しいバージョンのバックアップが提供されます。古いデータベースを削除し、新しいデータベースを復元してから、新しく復元されたデータベースにアクセスし、既存の SQL ログインを次のように追加するというルーチンを実行します。そのデータベースのユーザーに、これらすべてのデータベースに存在する標準ロールを割り当てます。

ルーチンは同じですが、各データベースの名前が異なり、データとログ ファイルの論理名と OS 名も異なります。私の好みは、各データベースに関連付けられた一連の名前を定義するテーブルを使用して補助データベースをセットアップし、次に、置換するデータベースの名前とバックアップ ファイルの名前をパラメーターとして受け入れるストアド プロシージャを作成することでした。SP は、関連する論理ファイル名と OS ファイル名を検索して、作業を行います。

これには、コマンドを文字列として構築してから実行する必要がありますが、これは問題ありません。ただし、ストアド プロシージャは、データベースを復元した後、SQL ログインをユーザーとしてデータベースに追加し、それをデータベース ロールに割り当てる前に、それを USE する必要があります。ストアド プロシージャではこれを実行できません。

ピースが動的に埋められ、このようにクロスデータベースを操作できる自動化された手順を作成するための代替手段は何ですか?

4

1 に答える 1

0

私は独自の解決策を思いつきました。

  1. ジョブを master データベースから実行するように指定し、実行するコードを含む Transact-SQL ステップを 1 つ定義して、作業を行うジョブを作成します。

  2. ジョブで使用されるオブジェクトをホストする目的だけで作成されたユーティリティ データベースで、データがジョブのパラメーターとなる最大 1 行を含むことを意図したテーブルを作成します。

  3. そのデータベースで、ジョブで使用するために格納する必要があるパラメーター (置き換えるデータベースの名前を含む) を使用して呼び出すことができるストアド プロシージャを作成します。SP はパラメーターを検証し、エラーを報告し、成功した場合はそれらをパラメーター テーブルに書き込み、msdb..sp_start_job を使用してジョブを開始する必要があります。

  4. ジョブ内で、置換対象のデータベースをジョブが参照する必要があるステートメントについては、ステートメントを文字列として作成し、EXECUTE します。

  5. 再作成されたデータベースで実行する必要があるステートメントについては、そのデータベース内の sp_executesql のインスタンスの引数として使用するステートメントを二重引用符で囲み、EXECUTE を使用してすべてを実行します。

    SET @statement = @dbName + '..sp_executesql ''[データベース @dbName で実行するステートメント]''';

    EXEC (@ステートメント);

  6. 出力をログ ファイルに書き込むようにジョブを構成します。

于 2013-01-18T21:27:56.263 に答える