SQL Server: подписка: как узнать, находится ли таблица на репликации / подписке - PullRequest
6 голосов
/ 20 января 2011

В SQL Server, на «стороне подписки», как узнать, находится ли таблица в процессе репликации / подписки?

Есть идеи?

Ответы [ 5 ]

6 голосов
/ 20 января 2011

Я не уверен, что есть простой ответ на этот вопрос, и я думаю, что ответы могут отличаться в зависимости от типа репликации. Я думаю, что вам, возможно, придется полагаться на эвристику, чтобы ответить на нее.

Что касается репликации снимков, я не могу придумать ничего, что могло бы выдать игру. Очевидно, что наличие таблиц репликации (например, MSreplication_objects) говорит о том, что репликация происходит в базе данных, но, насколько мне известно, никаких конкретных подсказок относительно таблиц нет.

Для репликации транзакций (без обновления) вы можете перейти через MSreplication_objects (в котором будут перечислены некоторые сохраненные процедуры), а затем использовать sys.sql_dependencies, чтобы найти таблицы, к которым они относятся

Для репликации транзакций (обновления) вы можете посмотреть в MSsubscription_articles (или проверить наличие триггеров обновления подписки для таблицы)

Для репликации слиянием вы можете посмотреть в sysmergearticles, но вам также придется посмотреть в sysmergesubscriptions, чтобы определить, что вы находитесь на стороне подписки.

3 голосов
/ 28 апреля 2012

Перейти к проверке базы данных абонентов для таблицы dbo.MSreplication_subscriptions. Если база данных subscriber, вы найдете эту таблицу. Также для поиска статей используйте это в subscribed базе данных

SELECT publisher,Publisher_Db,publication,article
FROM dbo.MSreplication_objects
0 голосов
/ 22 марта 2017

Я использовал Идея Дэвиена Неверующего (+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
0 голосов
/ 20 января 2011

Посмотрите на DATABASEPROPERTYEX.У него есть опция IsSubscribeed, которая должна делать то, что вы хотите.

0 голосов
/ 20 января 2011

Самый простой способ - создать связанный сервер с главным сервером и запросить таблицу [distribution].[dbo].[MSarticles].

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

...