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

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

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

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

1 Ответ

1 голос
/ 21 сентября 2011

Предполагая, что у вас есть пользователь локальной базы данных с именем 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;

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

...