2009-10-16 6 views
2

이 T-SQL을 고려하십시오. 기본적으로 내 "데이터베이스 연결 가져 오기"코드는 EXECUTE AS USER...WITH NO REVERT이 이미 실행 된 연결을 반환합니다.SQL Server 사용자 이름 기능

문제는 이러한 사용자 이름 기능 중 하나에서 일관된 결과를 얻을 수 없다는 것입니다. 출력의 두 줄은 다음과 같습니다

 
dbo   dbo   original_user  original_user  original_user 
my_test_user my_test_user S-1-9-3-XXXXX.. S-1-9-3-XXXXX.. S-1-9-3-XXXXX.. 

USER 기능은 'EXECUTE AS' AFTER 올바른 출력을 생성하지만, 오히려 사용자 이름보다 DBO을 보여주는 것를 미리 SUSER 기능은 정반대 - 그들은 올바른있어 처음에는 사칭을 한 후 일종의 ID를 표시합니다.

SUSER_SNAME에 대한 MSDN 문서는 이것이 올바르게 작동 할 것으로 예상되는 예제를 명시 적으로 제공합니다.

업데이트 : 내가 찾고있는 첫 번째 경우에는 'original_user'를 생성하고 두 번째에는 'my_test_user'를 생성하는 함수입니다.

+0

MSDN의 예제 사용하기 전에 EXECUTE AS LOGIN은 당신이하고있는 것과 매우 다릅니다.EXECUTE AS를 사용하기 위해서는 가장 의도적 인 방법으로 특별히 계획 한대로 가장 범위 및 인증 자 개념을 완벽하게 이해해야합니다. http://msdn.microsoft.com/en-us/library/ms188304.aspx –

답변

4

업데이트 : 당신은 너무

원래 여기 ORIGINAL_LOGIN FN 필요합니다

는 그 후, 일치하는 시스템 수준의 사용자가 없습니다. 그래서, 단순히 sys.database_principals

CREATE USER my_test_user WITHOUT LOGIN; 
SELECT USER_NAME(), USER, SUSER_SNAME(),SYSTEM_USER, suser_name(); 
EXECUTE AS USER = 'my_test_user' WITH NO REVERT; 
SELECT USER_NAME(), USER, SUSER_SNAME(),SYSTEM_USER, suser_name(), 
         SUSER_SID(); 

SELECT * FROM sys.database_principals WHERE sid = SUSER_SID(); 

이 설계된 경우 나도 몰라에서 SID를 반환 그래서, 데이터베이스 수준의 SID를 해결할 수 있지만 번호가 어디에서 오는지는 설명합니다.

노트 아래에 설명 된대로 나머지는 예상대로 :

  • 당신은 USER_NAME()는 시스템 관리자 권한으로 로그온되어 있기 때문에 대한 DBO를 얻을 수 있습니다. "sysadmin"을 가진 사람은 db 레벨 사용자 기능을 사용할 때 dbo입니다.

  • 사용자 컨텍스트를 변경 한 후, 데시벨 수준의 사용자 기능은 시스템 레벨의 사용자 기능에 대한 데이터베이스 사용자 컨텍스트

  • 에 해결, 당신은 로그인 당신은 익숙해 질 것이다

0

여기에 맞춰 보겠지만 처음에는 연결로 현재 로그인 한 사용자로 첫 번째 선택이 실행되고 두 번째 선택에서는 SQL Server에 다음과 같이 실행되도록 알려줍니다. 새로 생성 된 사용자

+0

예, 정확히 .... 그래서 어떤 함수가 첫 번째 경우에 'original_user'를 반환하고 두 번째 경우에 'my_test_user'를 반환합니까? – Clyde

1

사용자가 로그인하지 않은 사용자는 서비스 브로커 보안 (원격 서비스 바인딩) 또는 코드 서명 전용으로 사용되는 특별한 경우입니다. 그것들은 가장이 아니라 신원을 나타냅니다. EXECUTE AS 용 로그인없이 사용자를 사용하지 마십시오. 명시 적으로 로그인 사용자 매핑이없고 거의 모든 곳에서 매핑이 필요하기 때문에 모든 종류의 엣지 케이스를 처리하게됩니다.