我知道您的帖子已经提交了很长时间,但由于尚未提供合适的解决方案,我想我会贡献以下所有内容,以防其他人遇到相同的情况。
- 主要问题很可能是您对新的“小实例”缺乏足够的安全权限,因此看不到任何结果。一旦你解决了这个问题,你拥有的代码应该可以工作,并且可能是最简单/最有效的方法。来自微软的网站:
权限:
如果 sys.databases 的调用者不是数据库的所有者,并且数据库不是 master 或 tempdb,则查看相应行所需的最低权限是 ALTER ANY DATABASE 或 VIEW ANY DATABASE 服务器级权限,或 CREATE DATABASE 权限主数据库。调用方连接的数据库始终可以在 sys.databases 中查看。
(MSDN: permissions required to view sys.databases)
- 另一种验证给定数据库是否已发布、订阅或合并发布的方法是使用 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];
- 要使用上述示例查找系统上的所有数据库,只需使用 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;