SSMSと登録済みサーバーの結果


8

背景

私たちは、AGのサポートチームの1つに「主要な」AGテストハーネスを作成しようとしています。ある時点でどのサーバーがプライマリになるかがわからないため、登録されたサーバーグループに対してTSQLを実行するように指示されています。登録されたサーバーグループは、AG内のすべてのサーバーで構成されます。目標は、現在のプライマリサーバーでのみTSQLを実行することです。

現在のテストハーネス

IF EXISTS (SELECT *
FROM sys.dm_hadr_availability_replica_states AS HARS 
INNER JOIN sys.dm_hadr_availability_replica_cluster_states AS HACS ON HACS.replica_id = HARS.replica_id 
    WHERE (HARS.role_desc = 'PRIMARY') AND (HACS.replica_server_name LIKE @@SERVERNAME))
BEGIN
<<SOME CODE TO EXECUTE>>
END

問題点

マルチサーバークエリに応答する最初のサーバーが結果を返さない場合、他のサーバーが後で結果セットを返しても、SSMSは正しい結果セットが結果セットではないと想定します。したがって、このシナリオでは結果は返されません...これは正しくなく、期待される機能ではありません。

SSMS(これはCSチームにとって最も身近なツールです)を使用して、現在のプライマリサーバーでのみ実行を強制する方法を誰かが考えることができますか?


AGリスナーに接続して、クエリをそのように実行することを検討しましたか?それは常にプライマリをヒットすることを保証します。
Nic

残念ながら、これは不可能です。同じ名前のリスナーを持つ大量のテナントがあります。この場合は機能しません。
ハリー

回答:


10

以前にこの**に遭遇しましたが、正しく思い出せば、マルチサーバークエリで常に結果を取得するには、行が返されない場合は空の結果セットを強制する必要があります。ELSEつまりIF、その上にブランチが必要であり、ELSEその中で次のようなことを行います。

SELECT CONVERT(DATETIME, NULL) AS [Col1name],
       CONVERT(DECIMAL(12, 5), NULL) AS [Col2name],
       ...{additional fields}...
WHERE  1 = 0;

これにより、適切な名前とデータ型を持つ空の結果セットが生成されます。

または、私は過去にこれを試したことはありませんが(これを入力しているときに考えただけです)、そのブランチで一時停止して、プライマリ/目的のサーバーが常にそのブランチを返すことできるようにすることができELSEます最初に結果セット(これが本当の問題です。最初に応答するサーバーが、他のすべての応答が従わなければならない構造を定義します)。したがって、次のものはの唯一のものとして機能する可能性がありますELSE

WAITFOR DELAY '00:00:10'; -- 10 seconds (just needs to be longer than the real query takes)

ただし、他のサーバーから結果がまったく返されず、[メッセージ]タブにエラーメッセージが表示されたかどうかは覚えていません。それが起こった場合、空の結果セットは間違いなく進むべき道です。しかし、これが機能する場合、使用されるたびに強制された空の結果セットを調整する必要がないため、これは一般的なテンプレート(ケースのように見える)でより適切に機能する可能性があります。

更新:

OPは次のことを確認しました。

  • WAITFOR DELAY確かに仕事、そしてでした
  • レプリカはエラーメッセージを報告しましたが、OPの使用に問題はありませんでした

**私が遭遇した状況は似ていましたが、可用性グループまたは1つのサーバーのみからの結果が必要なこととは何の関係もありませんでした。私たちの状況は、同じスキーマの異なるデータの18台のサーバーがあり、18個のノードすべてにわたってさまざまなメンテナンスタスク、集約を実行する必要があるということでした。なんらかの理由で結果セットが返されないことがあり、その理由がストアドプロシージャ内で修正できなかったストアドプロシージャがいくつかありました。したがって、最初に返されたノードによっては、ほとんどの場合すべてが正常でしたが、時々結果セットを返さなかったノードが最初に返されたことがあります。したがって、結果を一時テーブルにダンプするなどの操作を行う必要があり、それが0の場合@@ROWCOUNTINSERT...EXEC、強制された空の結果セットを選択します。


2
そんなことは考えたこともないでしょう!遅延を待つのは大げさなことです!空の結果セットの構築を確実に保存します。@srutzkyに感謝します
ハリー

@ハリーどういたしまして、ありがとうございました:-) WAITFOR DELAYアプローチの利点について少し明確になるように回答を更新しました。そのアプローチが機能したことを確認しました。ありがとうございました。
ソロモンルツキー2017年

1
それは今週見た中で最もクールなものです。
ブレントオザー2017年

レプリカに間違いなくエラーがスローされますが、この場合は問題ありません。
Harry

@ハリーそのフィードバックを提供してくれてありがとう。私が遭遇した状況の一番下の説明とともに、それを私の回答に追加しました。
ソロモンルツキー2017年

0

常に一時テーブルを使用して結果を返し、グループ内のすべてのサーバーから一貫した応答を取得してきました。マルチサーバークエリは、SSMSの私のお気に入りの1つです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.