在SQL Server中,在“订阅方”上,如何知道某个表是否处于复制/订阅状态?
有什么想法吗?
答案 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'选项,可以做你想做的事。