04 octobre 2013

SQL : Savoir si une base est Publisher d'une réplication

Une première requête pour lister les tables ou vues publiées dans une publication SQL Server

... Cela reste à affiner et comprendre...

USE distribution;

SELECT DISTINCT @@SERVERNAME, P.Publication, A.Article
FROM dbo.MSdistribution_status AS s
INNER JOIN dbo.MSdistribution_agents AS Agents ON Agents.[id] = S.agent_id
INNER JOIN dbo.MSpublications AS P ON P.publication = Agents.publication
INNER JOIN dbo.MSarticles AS A ON A.article_id = S.article_id and P.publication_id = A.publication_id
WHERE Agents.subscriber_db NOT LIKE 'virtual'
 --AND s.UndelivCmdsInDistDB <> 0
--ORDER BY UndelivCmdsInDistDB DESC


A+

Mise à jour
J'ai trouvé plus simple et plus clair : Mon objectif étant de savoir si la base associée à ma chaîne de connexion est répliquée (= publisher d'un réplication) ou pas ?

Pour être une base publisher d'une réplication l'instance de SQL SERVER doit avoir une base "Distribution".
Dans cette base la table système : MSPublications liste les publications et les bases qui les concernent.
En Transac SQL cela donne un truc du style :

DECLARE @replique BIT = 0;
IF EXISTS (SELECT * FROM sys.databases WHERE name = 'distribution')
BEGIN
IF EXISTS (SELECT * FROM distribution.dbo.MSPublications WHERE publisher_db = DB_NAME())
  BEGIN 
    SET @replique = 1;
  END
END

SELECT @replique;

Y a plus qu'a en faire une fonction pour pouvoir l'utiliser simplement...


Mise à jour N°2

Savoir si une table est publiée dans une réplication

DECLARE @table varchar(255) = 'article'  --- nom de la table a chercher

DECLARE @replique BIT = 0;

IF (EXISTS (SELECT 1 FROM sys.databases WHERE name = 'distribution'))
BEGIN
 IF (EXISTS (SELECT 1 FROM distribution.dbo.MSPublications WHERE publisher_db = DB_NAME()))
  BEGIN 
    IF (EXISTS (SELECT 1 FROM distribution.dbo.MSarticles WHERE article = @table))
    BEGIN
      SET @replique = 1;
    END
  END
END

SELECT @replique;

Enjoy

Aucun commentaire:

Enregistrer un commentaire