2011-09-21 39 views

回答

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'; 

如果您不知道哪些其他數據庫(s)相關的登錄可能被發現,然後不,沒有一個簡單的方法,沒有像你指出的其他問題中的答案構建查詢。如果你要使用sp_msForEachDB,請謹慎使用:

http://sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/a-more-reliable-and-more-flexible-sp-msforeachdb.aspx

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; 

這不符合您的「單一查詢」的要求,但也許你可以解釋爲什麼這是一個要求。

相關問題