SQL Server:订阅:如何知道表是否正在复制/订阅

时间:2011-01-20 06:53:56

标签: sql sql-server replication

在SQL Server中,在“订阅方”上,如何知道某个表是否处于复制/订阅状态?

有什么想法吗?

5 个答案:

答案 0 :(得分:6)

我不确定这是一个简单的答案,我认为答案可能会因复制类型而异。我想你可能不得不依靠启发式来回答它。

对于快照复制,我无法想到任何可以让游戏消失的东西。显然,复制表(例如MSreplication_objects)的存在告诉您复制正在数据库中进行,但据我所知,没有关于表的任何具体线索。

对于事务复制(非更新),您可以通过MSreplication_objects(列出一些存储的过程)然后使用sys.sql_dependencies找到与

对于事务复制(更新),您可以查看MSsubscription_articles(或查找是否存在针对该表的订阅更新触发器)

对于合并复制,您可以查看sysmergearticles,但您还必须查看sysmergesubscriptions以确定您是否在订阅方。

答案 1 :(得分:3)

转到订阅者数据库检查表dbo.MSreplication_subscriptions。如果数据库是subscriber,您将找到此表。另外,要查找文章,请在subscribed数据库

中使用此文章
SELECT publisher,Publisher_Db,publication,article
FROM dbo.MSreplication_objects

答案 2 :(得分:0)

最简单的方法是创建一个到主服务器的链接服务器并查询表[distribution].[dbo].[MSarticles]

select * from [distribution].[dbo].[MSarticles]

答案 3 :(得分:0)

我使用Damien the Unbeliever's idea(+1)来生成适合我的代码

SELECT DISTINCT
    ot.object_id
    ,ot.schema_id
    ,r.publisher
    ,r.publisher_db
    ,r.publication
    ,r.article
FROM 
    dbo.MSreplication_objects R
        INNER JOIN sys.objects so ON r.object_name = so.name AND so.type = 'P' --stored procedures
        INNER JOIN sys.sql_dependencies dp ON so.object_id = dp.object_id
        INNER JOIN sys.objects ot ON dp.referenced_major_id = ot.object_id  --objects
                                AND r.article = ot.name

答案 4 :(得分:-1)

看看DATABASEPROPERTYEX。它有一个'IsSubscribed'选项,可以做你想做的事。