Можно ли найти эквивалентный логин во 2-й базе данных с помощью одного запроса?

Вход в систему на уровне базы данных может быть связан с логинами на уровне экземпляра сервера. И, если он существует, это, в свою очередь, может быть связано с нулем в один логин уровня базы данных в другой базе данных.

Можно ли получить соответствующий логин с помощью одного запроса?

Учитывая ответ на этот вопрос, я подозреваю, что это не так. Но стоит спросить.

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;

Это не соответствует вашему требованию "одного запроса", но, возможно, вы могли бы объяснить, почему это требование.

Другие вопросы по тегам