Можно ли найти эквивалентный логин во 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, пожалуйста, будьте осторожны:
- Создание более надежного и гибкого sp_MSforeachdb
- Выполнить команду в контексте каждой базы данных в SQL Server
Один из способов сделать это немного проще:
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;
Это не соответствует вашему требованию "одного запроса", но, возможно, вы могли бы объяснить, почему это требование.