检查是否启用了复制功能。

3
什么是在SQL 2000、2005和2008兼容格式中检查复制是否已启用的最简单方法?不需要任何状态信息,只需知道DB是否已启用。我需要这个信息,因为我希望我的数据库迁移代码在尝试执行模式更新之前,如果启用了复制,则会抛出异常。
谢谢。

有各种启发式方法,但没有简单的状态查询。此外,复制可以非常细粒度化,因此它可以在数据库中的某些对象上启用,而这些对象您并不打算修改。 - undefined
要检查是否安装了复制功能,请访问以下链接:https://dba.stackexchange.com/questions/246910/how-we-can-we-know-sql-replication-components-installed-in-sql-server - undefined
4个回答

11

我找到了这个查询,但它仅适用于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

1
直接回答你的问题,请使用以下代码:

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 &
--              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

IMHO


0
在查看这篇文章时,MSDN表示:“当用户数据库被配置为发布者或订阅者时,复制会向数据库添加系统表。当用户数据库从复制拓扑中移除时,这些表会被删除。”
你可以根据文章中列出的这些表的存在来证明复制,并相应地进行查询。

0

来自: 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

此语句缺少FROM子句。 - undefined
不确定这是否算作抄袭。来源(如有修改)。 - undefined
BOL指出,'is_subscribed'列将始终返回0。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接