數據庫級別的登錄可以與零到一個服務器實例級別的登錄相關聯。如果存在,則可以將其與另一個數據庫上的零到一個數據庫級別的登錄關聯。是否可以通過單個查詢在第二個數據庫中找到等效的登錄?
是否可以使用單個查詢檢索匹配的登錄名?
鑑於this question的答案,我懷疑它不是。但值得提問。
數據庫級別的登錄可以與零到一個服務器實例級別的登錄相關聯。如果存在,則可以將其與另一個數據庫上的零到一個數據庫級別的登錄關聯。是否可以通過單個查詢在第二個數據庫中找到等效的登錄?
是否可以使用單個查詢檢索匹配的登錄名?
鑑於this question的答案,我懷疑它不是。但值得提問。
假設你有一個名爲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';
如果您不知道哪些其他數據庫(s)相關的登錄可能被發現,然後不,沒有一個簡單的方法,沒有像你指出的其他問題中的答案構建查詢。如果你要使用sp_msForEachDB,請謹慎使用:
http://www.mssqltips.com/sqlservertip/2201/making-a-more-reliable-and-flexible-spmsforeachdb
的一種方式做到這一點更容易將是:
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;
這不符合您的「單一查詢」的要求,但也許你可以解釋爲什麼這是一個要求。