Проверьте, включена ли репликация

#sql-server #tsql #replication

#sql-сервер #tsql #репликация

Вопрос:

Какой самый простой способ проверить, включена ли репликация в формате, совместимом с SQL 2000, 2005 и 2008? Не нужна никакая информация о статусе … просто чтобы узнать, включено ли это для базы данных. Мне это нужно, потому что я хочу, чтобы мой код миграции БД вызывал исключение, если репликация включена, прежде чем он попытается выполнить обновления схемы.

Спасибо.

Комментарии:

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

Ответ №1:

Я нашел этот запрос, но это работает только в SQL 2005 и более поздних версиях (не для версии SQL 2000).

Запрос T-SQL

   select name, is_published, is_subscribed, is_merge_published, is_distributor
  from sys.databases
  where is_published = 1 or is_subscribed = 1 or
  is_merge_published = 1 or is_distributor = 1
  

Ответ №2:

Чтобы ответить на ваш вопрос напрямую, используйте:

 SELECT COUNT(*) AS IsPublished
FROM  sys.databases
WHERE (is_published | is_subscribed | is_merge_published) AND (name = @dbname)
  

Вы получите список опубликованных баз данных. при желании вы можете включить распределенные базы данных, добавив is_distributor

 SELECT name
FROM  sys.databases
WHERE (is_published | is_subscribed | is_merge_published | is_distributor = 1)
  

По-моему, все, что стоит сделать, стоит повторить, поэтому я создаю пользовательскую функцию (вы могли бы так же легко использовать хранимую процедуру):

 -- ================================================
-- Author:      J. Duke Rogers
--              Communicore Technologies amp;
--              Triangle Forensics
-- Create date: 07.25.20
-- Description: If @dbname is null or '' it uses 
--              the database in which it is defined
-- WARNING:     May cause black hole(s)
-- ================================================
CREATE FUNCTION fn_IsReplicationEnabled 
(
    @dbname sysname =NULL
)
RETURNS bit
AS
BEGIN
    DECLARE @Result int

    IF (@dbname is null or @dbname='')
        set @dbname=DB_NAME()

    SELECT @Result=COUNT(*)
        FROM  
            sys.databases
        WHERE 
            is_published | is_subscribed | is_merge_published=1 AND [name] = @dbname
    
    IF @Result is null or @Result <0 or @Result>1
        return CAST('Something impossible has occurred, singularity and/or black hole
                     imminent, don helmet!' as bit)
    
    RETURN IIF(@Result=1,1,0)

END
GO
  

ИМХО

Ответ №3:

При просмотре этой статьи в MSDN говорится: «Когда пользовательская база данных настроена как издатель или Подписчик, репликация добавляет системные таблицы в базу данных. Эти таблицы удаляются, когда пользовательская база данных удаляется из топологии репликации»

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

Ответ №4:

От:www.mssqlinsider.com/2013/09/check-databases-part-replication:

 SELECT 
    name as [Database name],
    CASE is_published 
        WHEN 0 THEN 'No' 
        ELSE 'Yes' 
        END AS [Is Published],
    CASE is_merge_published 
        WHEN 0 THEN 'No' 
        ELSE 'Yes' 
        END AS [Is Merge Published],
    CASE is_distributor 
        WHEN 0 THEN 'No' 
        ELSE 'Yes' 
        END AS [Is Distributor],
    CASE is_subscribed 
        WHEN 0 THEN 'No' 
        ELSE 'Yes' 
        END AS [Is Subscribed]
FROM sys.databases
WHERE database_id > 4
  

Комментарии:

1. В этом операторе нет предложения FROM .

2. Не уверен, считается ли это плагиатом или нет. Исходный код (в случае внесения изменений)

3. В BOL указано, что столбец ‘is_subscribed’ всегда будет возвращать 0.