web-dev-qa-db-ja.com

サブスクライバー側のプッシュサブスクリプションに関する情報を検出して取得する方法はありますか?

Azure SQLにデータベースがあります。オンプレミスデータベースからPush-subscriptionが存在する可能性があります。配布/公開/サブスクリプションが作成および構成されているオンプレミスサーバーにアクセスできません。

購読者や出版社の側からサブスクリプションに関する情報を取得する方法はたくさんありますが、簡単にグーグルできます。同時に、私はどうにかしてサブスクリプション側でサブスクリプションの存在/状態を検出するの方法を見つけることができませんでした。

私の現在の検出方法は間接的です。つまり、新しいレコードが頻繁に出現するテーブルを知っていて、レコードの数を数え、その後1分後にもう一度カウントします。これは、データベースでアクティビティがない夜には役に立ちません。また、1分以上待つ必要があるため、これは不便です。

私が必要とするものは明確かつ直接表示するスクリプト私、サブスクリプションが存在する場合、そしておそらく/可能な場合はいくつかの追加情報:*それがアクティブである場合(現時点でプッシュ側の動作は適切に行われます) *構成されている記事など

4
moudrick

サブスクライバー側にトランザクションレプリケーション(プッシュサブスクリプション)用の4つのテーブルがあります。

サブスクライバーデータベースのレプリケーションに関連付けられているオブジェクトごとに1行が含まれます

ローカルサブスクライバデータベースにサービスを提供しているディストリビューションエージェントごとに1行のレプリケーション情報が含まれています

ディストリビューションエージェントと更新可能なサブスクリプションのトリガーによって、サブスクリプションプロパティを追跡するために使用されます

スナップショットが適用されているときにサブスクライバーに正常に配信されたファイルを追跡するために使用されます


この列を使用して、サブスクライバー側でレプリケーションのステータスを監視できます

SELECT login_time,
       last_sync_status,
       last_sync_summary,
       last_sync_time,
       spid 
FROM dbo.MSsubscription_agents
3
Hamza Rabah

これが方法です 私はそれをやっていますnot sure if it would work in Azure though

最初に sp_MSforeachdbの代わりにAaron Bertrandのsp_foreachdbを取得

次に、以下のスクリプトでそれを使用します。

---------------------------------------------------------
-- get all info about subscribers in a server
-- marcello miorelli
-- 23-dec-2017
---------------------------------------------------------
IF object_id('TEMPDB..#RADHE_SP2') IS NOT NULL
    DROP TABLE #RADHE_SP2

    create table #RADHE_SP2 (
        publisher sysname NOT NULL,  
        publisher_db sysname NOT NULL, 
        publication sysname NOT NULL, 
        replication_type int,
        subscription_type int,
        last_updated datetime,
        subscriberd_db sysname,
        update_mode int,
        last_sync_status int,
        last_sync_summary nvarchar(4000),
        last_sync_time datetime)


declare @db_list NVARCHAR(MAX)

SELECT @db_list  = STUFF((
                        SELECT ', ' + name
                         FROM sys.databases d
                        WHERE 1=1
                          and d.[state] = 0
                        FOR XML PATH(''), TYPE).value('.[1]', 'nvarchar(max)'), 1, 2, '')
--select @db_list

--exec sp_foreachdb @database_list = @db_list
--               ,@command='use ?; print db_name()'   


EXEC sp_foreachdb
@database_list = @db_list,
@command=
'use ?; 

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

insert into #RADHE_SP2
exec sp_MSenumsubscriptions

' 

SELECT * FROM #RADHE_SP2

それはあなたにこのようなものを与えるでしょう: enter image description here

0