2011-09-21 7 views
1

데이터베이스 레벨 로그인은 0에서 1 개의 서버 인스턴스 레벨 로그인과 연관 될 수 있습니다. 또한 존재하는 경우 다른 데이터베이스의 0에서 1 개의 데이터베이스 수준 로그인과 연결할 수 있습니다.단일 쿼리를 통해 두 번째 데이터베이스에서 동등한 로그인을 찾을 수 있습니까?

단일 쿼리를 사용하여 일치하는 로그인을 검색 할 수 있습니까?

this question에 대한 답변이 주어지면 나는 그렇지 않다고 생각합니다. 하지만 물어 볼 가치가 있습니다. 데이터베이스 관련 사용자 [splunge]가있는 경우

답변

1

당신이 foo라는 이름의 로컬 데이터베이스 사용자를 가정하면, 찾아이 쿼리를 사용할 수 있습니다

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

당신이 모르는 경우 다른 어떤 데이터베이스 (들) 관련 로그인이 발견 될 수 있습니다, 그렇다면 아니오, 당신이 지적한 다른 질문에 대답과 같은 쿼리를 구성하지 않고 간단한 방법이 없습니다. 것보다 쉽게이 조금 할

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

한 가지 방법 : 당신이 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; 

이 충족되지 않는 "단일 쿼리"의 요구 사항이지만 어쩌면 왜 그것이 요구 사항인지 설명 할 수 있습니다.