1

数据库级登录可以与零到一个服务器实例级登录相关联。如果它存在,那么它又可以与另一个数据库上的零到一个数据库级登录相关联。

是否可以使用单个查询检索匹配的登录名?

鉴于这个问题的答案,我怀疑不是。但值得一问。

4

1 回答 1

1

假设您有一个名为 的本地数据库用户foo,您可以使用此查询来确定数据库 [splunge] 中是否存在相关用户:

SELECT [local].[name], [remote].[name]
  FROM sys.database_principals AS [local]
  INNER JOIN [splunge].sys.database_principals AS [remote]
  ON [local].[sid] = [remote].[sid]
  WHERE [local].[name] = 'foo';

如果您不知道可以在哪个其他数据库中找到相关登录名,那么不,没有一种简单的方法可以不构造一个查询,就像您指出的另一个问题中的答案一样。如果您要使用 sp_msForEachDB,请谨慎使用:

一种更容易做到这一点的方法是:

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql = @sql + '
    UNION ALL SELECT ''' + QUOTENAME(name)
    + ''', name COLLATE SQL_Latin1_General_CP1_CI_AS
    FROM ' + QUOTENAME(name) + '.sys.database_principals
    WHERE sid IN (SELECT sid FROM x)'
    FROM sys.databases 
    WHERE database_id > 4; -- assume ignore system dbs

SET @sql = ';WITH x AS (SELECT sid FROM sys.database_principals 
    WHERE name = ''foo'')' + STUFF(@sql, 1, 12, '') + ';';

PRINT @sql;
--EXEC sp_executesql @sql;

这不符合您对“单个查询”的要求,但也许您可以解释为什么这是一个要求。

于 2011-09-21T04:06:39.107 回答