【问题标题】:List all active databases that are marked for replication列出所有标记为复制的活动数据库
【发布时间】:2015-03-19 15:14:33
【问题描述】:

我正在尝试找出一种方法来列出所有标记为要复制的活动数据库。

我尝试了两个不起作用的查询:

select * from [distribution].[dbo].[MSpublications]

在此代码中,您将看到所有已复制的数据库,即使其中一个当前未复制但曾经复制过。

select * from sys.databases 
where is_published=1 or is_subscribed=1 or is_merge_published=1

我对第二个查询也不满意。

【问题讨论】:

  • 您对第二个查询有什么顾虑?
  • 好吧,它不起作用。我在一个小实例上使用它,发现被复制的数据库没有显示在这个查询中。

标签: sql-server sql-server-2008 tsql sql-server-2005 sql-server-2008-r2


【解决方案1】:

我知道您的帖子已经提交了很长时间,但由于尚未提供合适的解决方案,我想我会贡献以下所有内容,以防其他人遇到相同的情况。

  1. 主要问题很可能是您对新的“小实例”缺乏足够的安全权限,因此看不到任何结果。一旦你解决了这个问题,你拥有的代码应该可以工作,并且可能是最简单/最有效的方法。来自微软的网站:

权限:
如果 sys.databases 的调用者不是数据库的所有者,并且数据库不是 master 或 tempdb,则查看相应行所需的最低权限是 ALTER ANY DATABASE 或 VIEW ANY DATABASE 服务器级权限,或 CREATE DATABASE 权限主数据库。调用方连接的数据库始终可以在 sys.databases 中查看。
(MSDN: permissions required to view sys.databases)

  1. 另一种验证给定数据库是否已发布、订阅或合并发布的方法是使用 DATABASEPROPERTYEX() 函数。我在下面包含一个示例,它将拉取单个数据库。 (MSDN: DATABASEPROPERTYEX)

DECLARE @db NVARCHAR(70);
SET @db = N'{database_name}'; --Insert here the name of the DB-in-question.

SELECT  @db AS [Database], 
        CASE DATABASEPROPERTYEX(@db, N'IsPublished') WHEN 1 THEN N'TRUE' ELSE 'FALSE' END AS [Published], 
        CASE DATABASEPROPERTYEX(@db, N'IsSubscribed') WHEN 1 THEN N'TRUE' ELSE 'FALSE' END AS [Subscribed], 
        CASE DATABASEPROPERTYEX(@db, N'IsMergePublished') WHEN 1 THEN N'TRUE' ELSE 'FALSE' END AS [Merge_Published];

  1. 要使用上述示例查找系统上的所有数据库,只需使用 sp_msForEachDB,如下例所示:

更简单的方法:

DECLARE @sql NVARCHAR(1000);
SET @sql = N'USE ?; 
        SELECT ''?'' AS [Database], 
        CASE DATABASEPROPERTYEX(''?'', N''IsPublished'') WHEN 1 THEN N''TRUE'' ELSE ''--'' END AS [Published], 
        CASE DATABASEPROPERTYEX(''?'', N''IsSubscribed'') WHEN 1 THEN N''TRUE'' ELSE ''--'' END AS [Subscribed], 
        CASE DATABASEPROPERTYEX(''?'', N''IsMergePublished'') WHEN 1 THEN N''TRUE'' ELSE ''--'' END AS [Merge_Published];';
EXEC sp_msForEachDB @SQL;

最干净的输出:

DECLARE @sql NVARCHAR(1000);
DECLARE @tbl AS TABLE (
    [db] NVARCHAR(70), 
    [isPublished] NVARCHAR(5), 
    [isSubscribed] NVARCHAR(5), 
    [isMergePublished] NVARCHAR(5));  

SET @sql = 
    N'IF ''?'' NOT IN (''master'', ''model'', ''msdb'', ''tempdb'', ''distribution'') BEGIN 
        USE ?; 
        SELECT ''?'' AS [Database], 
        CASE DATABASEPROPERTYEX(''?'', N''IsPublished'') WHEN 1 THEN N''TRUE'' ELSE ''--'' END AS [Published], 
        CASE DATABASEPROPERTYEX(''?'', N''IsSubscribed'') WHEN 1 THEN N''TRUE'' ELSE ''--'' END AS [Subscribed], 
        CASE DATABASEPROPERTYEX(''?'', N''IsMergePublished'') WHEN 1 THEN N''TRUE'' ELSE ''--'' END AS [Merge_Published];
    END';
INSERT INTO @tbl EXEC sp_msForEachDB @SQL;
SELECT * FROM @tbl ORDER BY [db] ASC;  

【讨论】:

    【解决方案2】:

    exec sp_helpreplicationdboption

    【讨论】:

    • 这个答案有什么问题?此存储过程来自 Microsoft,执行时会列出服务器上的所有数据库以及指示数据库已启用复制的标志。你的意思不是这样吗?我需要发布输出的屏幕截图吗?
    猜你喜欢
    • 2010-09-14
    • 2012-11-30
    • 1970-01-01
    • 2023-03-28
    • 2017-10-12
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    相关资源
    最近更新 更多