【发布时间】:2011-06-12 06:30:46
【问题描述】:
在 SQL Server 中,在“订阅端”,如何知道表是否处于复制/订阅状态?
有什么想法吗?
【问题讨论】:
-
我刚刚多次构建和拆除复制以尝试找到一些答案,但我仍然对我发布的内容不满意:-|
标签: sql sql-server replication
在 SQL Server 中,在“订阅端”,如何知道表是否处于复制/订阅状态?
有什么想法吗?
【问题讨论】:
标签: sql sql-server replication
最简单的方法是创建一个到主服务器的链接服务器并查询表[distribution].[dbo].[MSarticles]。
select * from [distribution].[dbo].[MSarticles]
【讨论】:
我使用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
【讨论】:
我不确定是否有一个简单的答案,我认为答案可能会因复制类型而异。我认为您可能不得不依靠启发式来回答它。
对于快照复制,我想不出有什么东西会泄露游戏。显然,复制表的存在(例如MSreplication_objects)告诉您复制正在数据库中进行,但据我所知,没有关于表的任何具体线索。
对于事务复制(非更新),您可以通过MSreplication_objects(其中将列出一些存储的过程)然后使用sys.sql_dependencies 找到与这些相关的表
对于事务复制(更新),您可以查看MSsubscription_articles(或针对表查找订阅更新触发器的存在)
对于合并复制,您可以查看 sysmergearticles,但您还必须查看 sysmergesubscriptions 以确定您在订阅端。
【讨论】:
转到订阅者数据库检查表dbo.MSreplication_subscriptions。如果数据库是subscriber,你会找到这张表。另外,要查找文章,请在 subscribed 数据库中使用它
SELECT publisher,Publisher_Db,publication,article
FROM dbo.MSreplication_objects
【讨论】:
看看 DATABASEPROPERTYEX。它有一个“IsSubscribed”选项,应该可以做你想做的事情。
【讨论】: