web-dev-qa-db-ja.com

SQLスナップショットのリダイレクト

スナップショットと非同期のデータベースミラーリングを実装しています。これにより、レポート機能を備えたディザスタリカバリが提供されます。サーバーAのプリンシパルにはサーバーBにミラーリングするデータベースが含まれ、スナップショットはサーバーBのデータベースで作成されます。

更新されたデータを有効にするために、ミラーサーバーデータベースに30分ごとにデータベーススナップショットを作成します。すべてのSSRS /レポートストアドプロシージャクエリを最新のスナップショットにリダイレクトするにはどうすればよいですか?レポートのクエリはかなり短く、一般的には10秒ほどです。マイクロソフトは以下でプログラマティックソリューションについて言及していますが、それが何かわかりませんか?したがって、SalesDB1030、SalesDB1100、SalesDB1130、24クロックがdbnameの後に追加されます

レポートクエリは

select * from SalesDbSnapshot.dbo.SalesTransaction st
inner join SalesDbSnapshot.dbo.Customer cs
    on st.CustomerId = cs.CustomerId
inner join SalesDbSnapshot.dbo.Product pr
    on st.ProductId = pr.ProductId

データベーススナップショットの作成

「データベーススナップショットを使用するには、クライアントはそれがどこにあるかを知る必要があります。ユーザーは、別のデータベーススナップショットが作成または削除されているときに、あるデータベーススナップショットから読み取ることができます。ただし、既存のスナップショットを新しいスナップショットに置き換える場合は、クライアントをにリダイレクトする必要があります。新しいスナップショット。ユーザーはSQL Server Management Studioを使用してデータベーススナップショットに手動で接続できます。ただし、運用環境をサポートするには、レポート作成クライアントをデータベースの最新のデータベーススナップショットに透過的に導くプログラムソリューションを作成する必要があります。 」

3
user129291

1つのアプローチは、レポートに必要なスナップショット内のオブジェクトを参照する同義語のみを含むデータベースを作成することです。クライアントは、シノニムデータベースに接続し、スナップショットを直接使用しているかのようにクエリを実行できます。

新しいスナップショットが作成されるたびに、スクリプトを実行して、シノニムを新しいスナップショットデータベース名で更新します。以下は、スナップショット内のすべてのテーブル、ビュー、およびプロシージャのシノニムを再作成する例です。必要に応じて、オブジェクトタイプを追加します。

USE SynonymDatabase;

DECLARE
      @SnapshotDatabaseName sysname = N'YourSnapshotDatabase'
    , @SQL nvarchar(MAX)
    , @DropSynonymsSQL nvarchar(MAX)
    , @CreateSynonymsSQL nvarchar(MAX);

--generate DROP SYNONYM script
SELECT @DropSynonymsSQL = (SELECT N'DROP SYNONYM ' + QUOTENAME(sch.name) + N'.' + QUOTENAME(syn.name) + N';
'
FROM sys.synonyms AS syn
JOIN sys.schemas AS sch ON sch.schema_id = syn.schema_id
FOR XML PATH(''), TYPE).value('(./text())[1]', 'nvarchar(MAX)');

--generate CREATE SYNONYM script
SET @SQL = N'USE ' + QUOTENAME(@SnapshotDatabaseName) + N';
SELECT @CreateSynonymsSQL = (SELECT N''CREATE SYNONYM '' + QUOTENAME(sch.name) + N''.'' + QUOTENAME(obj.name) +
    N'' FOR '' + QUOTENAME(@SnapshotDatabaseName) + N''.'' + QUOTENAME(sch.name) + N''.'' + QUOTENAME(obj.name) + N'';
''
FROM sys.objects AS obj
JOIN sys.schemas AS sch ON sch.schema_id = obj.schema_id
WHERE
    obj.type IN(''U'', ''V'', ''P'')
    AND obj.is_ms_shipped = 0
FOR XML PATH(''''), TYPE).value(''(./text())[1]'', ''nvarchar(MAX)'');';
EXECUTE sp_executesql
      @SQL
    , N'@SnapshotDatabaseName sysname, @CreateSynonymsSQL nvarchar(MAX) OUTPUT'
    , @SnapshotDatabaseName = @SnapshotDatabaseName
    , @CreateSynonymsSQL = @CreateSynonymsSQL OUTPUT;

BEGIN TRY
    BEGIN TRAN;
    EXEC sp_executesql @DropSynonymsSQL;
    EXEC sp_executesql @CreateSynonymsSQL;
    COMMIT;
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0 ROLLBACK;
    THROW;
END CATCH;
GO

Aaronから:スナップショットを作成するジョブは新しいデータベース名をテーブルに格納でき、SSRSはそのデータソースを使用して動的に接続を作成できます。この例は少し異なりますが、同じ一般的な概念が適用されます

https://www.mssqltips.com/sqlservertip/4302/implement-dynamic-data-sources-in-sql-server-reporting-services/

5
Dan Guzman