2012-11-09 8 views
6

이것은 바보 같지만 실제로는 혼란 스럽습니다. MSDN에서 정의는 SQL Server 리소스를 요청할 수있는 엔터티입니다. 기본적으로 프린시 펄에는 세 가지 유형이 있습니다. Windows 수준의 주체, SQL Server 수준의 주체 및 데이터베이스 수준의 주체입니다. 지금까지는 괜찮습니다. 단지이 원리가 어떤 유형인지에 관계없이 한 교장의 식별자가 다른 교장의 식별자와 달라야한다는 인상을 준다. (이 세 가지 유형의 모든 교장이 하나의 테이블에 배열 될 수 있다면 그들은 고유 한 식별자를 가짐)SQL Server의 주체를 이해하는 방법?

1)

Select name,principal_id from sys.database_principals 

(참고 : 나는 하나의 데이터베이스에서 실행)

2)

혼란스러운 부분은 아래 세 가지 쿼리에서 온다

Select name,principal_id from sys.server_principals 

이제 데이터베이스 사용자 주체를 반환하는 반면, 두 번째 서버 사용자는 서버 사용자 주체를 반환합니다 (잘못된 경우 올바른 경우). 하지만 왜 첫 번째 쿼리의 한 행이 두 번째 쿼리의 한 행과 동일한 principal_id를 가질 수 있습니까? 예를 들어, 데이터베이스 주체에서 한 행은 다음과 같습니다

이름 : INFORMATION_SCHEMA, principal_id : 시스템 관리자, principal_id : 3 두 번째 쿼리에서 한 행은

이름 3

동안

이 두 principal_id는 무엇입니까? 앞에서 언급했듯이 두 사용자의 식별자는 DB 사용자이고 다른 사용자가 서버 사용자 (이름에서 principal_id가 식별자라고 가정)가 다를지라도 생각했습니다.

principal_id가 모든 주체에 대해 고유하지 않고 각 쿼리의 범위에서만 고유 한 경우 (첫 번째 쿼리의 principal_id는 데이터베이스 사용자의 식별자이므로 서버 사용자의 식별자와 동일 할 수 있습니다.), 그때는 무슨 뜻 세 번째 쿼리를 이해하지 않습니다

3) 두 principal_id 자신의 범위 내에서만 고유

SELECT 
    SDP.PRINCIPAL_ID AS [Principal ID], 
    SDP.NAME AS [Database UserName], 
    SDP.TYPE_DESC AS [Datebase UserType], 
    SSP.NAME AS [Server LoginName], 
    SSP.TYPE_DESC AS [Server LoginType] 
FROM sys.database_principals SDP 
INNER JOIN sys.server_principals SSP 
ON SDP.PRINCIPAL_ID = SSP.PRINCIPAL_ID 

경우, 내부를 만들기 위해 무엇을 의미 하는가 principal_id에 가입 하시겠습니까? 내부 조인은이 열이 공동으로 고유하다는 것을 의미합니다.

내가 오해 한 것은 아주 초보적인 것이 틀림 없습니다. 그것에 어떤 도움을 주셔서 감사합니다!

+0

어디에서 3 번째 쿼리를 얻었습니까? –

+0

@Damien_The_Unbeliever 많은 기사가 비슷한 기사가 있습니다. 이 링크처럼 : http://www.sql-server-performance.com/2009/analyzing-sql-server-permissions/ – tete

+0

그리고 그 기사에있는 한 가지 주석을 읽었습니다 - principal_id에 합류하는 것이 잘못되었다는 것을 지적하고, 대신 SID를 사용해야합니까? –

답변

8

sys.database_principalssys.server_principalsprincipal_id 사이의 대응 관계가 없습니다. 처음에는 데이터베이스 내에서 유일한 것으로 문서화되었습니다. 둘째, 서버 전체에서 고유합니다. 그리고 동일한보기에서이 열들 사이에 문서화 된 관계는 없습니다.

실제로 낮은 번호의 principal_id은 두보기에서 모두 할당 될 가능성이 높으며 관련이있는 주체는 관련이 없습니다.

principal_id을 사용하여 두보기 간의 조인을 나타내는 쿼리가 잘못되었습니다.

+1

감사합니다. 나는 또 하나의 질문이있다 : 내 링크의 주석은 쿼리의 목적이 서버 로그인을 해당 데이터베이스 사용자와 일치시키는 것이라고 말했다. 그리고 그것은 실제로 제가하려고하는 것입니다. 그러나 수정 된 쿼리를 실행하면 (sid에서 내부 조인이 변경됨) 로그인 정보를 얻을 수없고 매핑 된 DB 사용자와도 연결할 수 없습니다. 내가 다시하고 싶은 일을 명확히 해두 자. 내가 SYSTEM_USER을 선택하면 윈도우 로그인을 얻었고 CURRENT_USER를 selct하면 dbo를 얻는다. 나는이 둘 사이의 매핑을 찾으려고 노력하고있다. – tete

+0

그러나 server_principal 쿼리에 로그인 한 경우에도 database_principal에 동일한 sid가없는 로그인이 있습니다. 그래서 나는 추적을 잃어 버렸다. 내가 뭐 잘못 했어요? 예를 들어, 모든 database_principal을 표시 할 수있는 권한이 있습니까? 내 로그인은 sysadmin 서버 역할하에 있습니다. – tete

+0

@tete -'sysadmin'의 멤버라면 모든 종류의 이상한 규칙들이 시작됩니다 - 당신은'database_principals'에 어떤 항목도없이 모든 데이터베이스에서 자동으로'dbo'를합니다. 예를 들면. –