#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.