2011-01-20 9 views

risposta

6

Non sono sicuro che ci sia una risposta semplice a questo, e penso che le risposte potrebbero variare in base al tipo di replica. Penso che potresti dover fare affidamento sull'euristica per rispondere.

Per la replica di istantanee, non riesco a pensare a nulla che possa dare via il gioco. Ovviamente, la presenza delle tabelle di replica (ad esempio MSreplication_objects) indica che la replica si sta verificando all'interno del database, ma non ci sono indizi specifici sulle tabelle, per quanto ne so.

Per la replica transazionale (non l'aggiornamento), si può essere in grado di andare via MSreplication_objects (che elencherà alcune stored procedure) e quindi utilizzare sys.sql_dependencies per individuare le tabelle che queste si riferiscono a

Per la replica di transazione (aggiornamento) , si può guardare in MSsubscription_articles (o cercare la presenza della sottoscrizione l'aggiornamento trigger contro il tavolo)

per replica di unione, si può guardare in sysmergearticles, ma si sarebbe anche necessario guardare in sysmergesubscriptions per determinare in cui si' ri sul lato dell'abbonamento.

0

Il modo più semplice sarebbe quello di creare un server collegato al server principale e interrogare la tabella [distribuzione]. [Dbo]. [MSarticles].

-1

Dai un'occhiata a DATABASEPROPERTYEX. Ha un'opzione 'IsSubscribed' che dovrebbe fare ciò che vuoi che faccia.

+0

Questo ti dirà se il database è un abbonato, ma non ti permetterà di determinare quali tabelle fanno parte dell'abbonamento. I database di sottoscrizione possono contenere le proprie tabelle che non fanno parte della pubblicazione. –

+0

Whoops ... hai ragione. Ho interpretato erroneamente la domanda come "come capire se un database è un abbonato". –

3

Passare al database dell'abbonato controllare la tabella dbo.MSreplication_subscriptions. Se il database è subscriber, troverai questa tabella. Inoltre, per scoprire articoli utilizzano questo nel database subscribed

SELECT publisher,Publisher_Db,publication,article 
FROM dbo.MSreplication_objects 
0

ho usato idea Damien del Unbeliever (+1) per la produzione di questo codice che ha funzionato per me

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 
Problemi correlati