2012-11-09 11 views
6

Sembra stupido, ma trovo davvero confuso: in MSDN la definizione è l'entità che può richiedere risorse di SQL Server. E fondamentalmente ci sono tre tipi di principal: principal a livello di Windows, principal a livello di SQL Server e principal a livello di database. Finora va bene. Solo che mi dà l'impressione che l'identificatore di un preside debba essere diverso da altri, indipendentemente dal tipo di principio (se tutti i principali di questi tre tipi potrebbero essere disposti in un'unica tabella, avrebbero identificatori univoci)Come comprendere i principali in SQL Server?

La parte confusa deriva da queste tre domande qui sotto:

1)

Select name,principal_id from sys.database_principals 

(Nota: ho eseguito su un database)

2)

Ora so che il primo restituisce i principal degli utenti del database mentre il secondo restituisce i principal degli utenti del server (correggimi se ho torto). Ma perché una riga della prima query può avere lo stesso principal_id di uno dalla seconda query? Ad esempio, una riga dalle entità di database sarebbe:

nome: INFORMATION_SCHEMA, principal_id: 3

mentre una riga dalla seconda query è

nome: sysadmin, principal_id: 3

Quali sono questi due principal_id? Come ho detto, pensavo che gli identificativi di due principal sarebbero stati diversi, anche se uno è un utente di DB e l'altro è un utente di server (e dal nome presumo che principal_id è l'identificatore).

Bene, se il principal_id non è univoco per tutti i principal, ma solo univoco per ciascun intervallo di query (il principal_id dalla prima query sono solo identificativi per gli utenti del database, quindi può essere uguale a uno degli utenti del server), ho poi una terza query e non capisco che cosa vuol dire:

3)

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 

Se i due principal_id sono unici solo all'interno delle loro gamme, che cosa vuol dire fare un interno unisciti a principal_id? Un join interno significa che questa colonna è congiuntamente unica, giusto?

Ci deve essere qualcosa di molto elementare che non capisco. Grazie per l'aiuto in proposito!

+0

Da dove hai ottenuto la terza query? –

+0

@Damien_The_Unbeliever molti articoli hanno simili. Ti piace questo link: http://www.sql-server-performance.com/2009/analyzing-sql-server-permissions/ – tete

+0

e hai letto l'unico commento presente in quell'articolo - sottolineando che l'iscrizione a principal_id non è corretta, e che i SID dovrebbero invece essere usati? –

risposta

8

Non c'è corrispondenza tra principal_id s su sys.database_principals e sys.server_principals. Sul primo, è documentato solo per essere unico all'interno del database. Nel secondo, sono unici attraverso il server. E non c'è alcuna relazione documentata tra queste colonne nelle stesse viste.

Infatti, è molto probabile che in entrambe le viste sia assegnato un numero basso principal_id e che i principi a cui si riferiscono non siano correlati.

Quindi la query che mostra un join tra le due viste utilizzando principal_id è errata.

+1

grazie per la risposta. Ho ancora una domanda: il commento nel mio link diceva che lo scopo della query è quello di abbinare gli accessi al server con il loro corrispondente utente del database. Ed è in realtà quello che sto cercando di fare. Tuttavia, se eseguo la query modificata (modificato il inner join su sid), non riesco a ottenere il mio login e con il suo utente DB mappato. Permettetemi di chiarire cosa voglio fare di nuovo: se eseguo select SYSTEM_USER, ho ottenuto il mio login di Windows, e ho selezionato CURRENT_USER, ho ricevuto dbo. Sto cercando di trovare la mappatura tra questi due. – tete

+0

Tuttavia, sebbene io abbia il mio login nella query server_principal, non c'è nessuno con lo stesso sid in database_principal. Quindi ho perso la mia traccia. Ho fatto qualcosa di male? Ad esempio, ho il permesso di visualizzare tutto il database_principal? Il mio login è sotto il ruolo del server sysadmin – tete

+0

@tete - se sei un membro di 'sysadmin' allora entrano in gioco tutti i tipi di regole strane - tieni automaticamente' dbo' in ogni database, senza che ci siano voci in 'database_principals' , per esempio. –