Предполагая, что у вас есть пользователь локальной базы данных с именем 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;
Это не соответствует вашему требованию «одного запроса»но, возможно, вы могли бы объяснить, почему это требование.