2012-11-09 19 views
6

Das klingt dumm, aber ich finde es wirklich verwirrend: in MSDN ist die Definition die Entität, die SQL Server-Ressourcen anfordern kann. Grundsätzlich gibt es drei Arten von Prinzipalen: Principals auf Windows-Ebene, Principals auf SQL Server-Ebene und Principals auf Datenbankebene. Bis jetzt ist es in Ordnung. Nur, dass es mir den Eindruck vermittelt, dass der Bezeichner eines Principals anders sein sollte als der anderer, unabhängig davon, um welchen Typ es sich handelt (wenn alle Principals dieser drei Typen in einer Tabelle angeordnet werden könnten, hätten sie eindeutige Bezeichner)So verstehen Sie Prinzipale in SQL Server?

Der verwirrende Teil stammt aus diesen drei Anfragen unter:

1)

Select name,principal_id from sys.database_principals 

(Anmerkung: ich laufe es auf einer Datenbank)

2)

Select name,principal_id from sys.server_principals 

Jetzt weiß ich, die erste Datenbank Benutzerprinzipal zurückgibt, während die zweite Server-Benutzer-Prinzipale zurückgibt (korrigieren Sie mich, wenn ich falsch liege). Aber warum kann eine Zeile aus der ersten Abfrage die gleiche Prinzipal-ID haben wie eine aus der zweiten Abfrage? Zum Beispiel würde eine Zeile aus der Datenbank Principals sein:

Name: INFORMATION_SCHEMA, principal_id: 3

während einer Zeile aus der zweiten Abfrage ist

Name: Sysadmin, principal_id: 3

Was sind diese beiden Prinzipal_ID? Wie ich bereits erwähnt habe, dachte ich, dass die Bezeichner von zwei Principals unterschiedlich sein würden, selbst wenn der eine DB-Benutzer und der andere Serverbenutzer ist (und von dem Namen, den ich annehme, ist PrincipalID der Bezeichner).

Nun, wenn die Prinzipal_id nicht für alle Principals eindeutig ist, sondern nur für jeden Abfragebereich eindeutig ist (die Prinzipal_ID aus der ersten Abfrage sind nur Bezeichner für Datenbankbenutzer, also kann es sich auch um eine von Serverbenutzern handeln), habe ich dann eine dritte Abfrage haben und nicht verstehen, was es bedeutet:

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 

Wenn die beiden principal_id in ihren Bereichen nur einzigartig sind, was bedeutet es, einen inneren zu machen beitreten auf beide Prinzipal_id? Eine innere Verbindung bedeutet, dass diese Spalte gemeinsam einzigartig ist, oder?

Es muss etwas sehr elementares geben, dass ich falsch verstehe. Danke für jede Hilfe!

+0

Woher haben Sie die 3. Abfrage erhalten? –

+0

@Damien_The_Unbeliever viele Artikel haben ähnliche. Wie dieser Link: http://www.sql-server-performance.com/2009/analyzing-sql-server-permissions/ – tete

+0

und haben Sie den einen Kommentar gelesen, der zu diesem Artikel ist - darauf hinweist, dass Beitritt zu Principal_id ist falsch, und dass SIDs stattdessen verwendet werden sollten? –

Antwort

8

Es gibt keine Entsprechung zwischen principal_id s auf sys.database_principals und sys.server_principals. Auf der ersten Seite ist nur dokumentiert, dass es innerhalb der Datenbank eindeutig ist. Auf der anderen Seite sind sie auf dem Server einzigartig. Und es gibt keine dokumentierte Beziehung zwischen diesen Spalten in den gleichen Ansichten.

In der Tat werden sehr niedrige principal_id s in beiden Sichten zugeordnet, und die Prinzipien, auf die sie sich beziehen, sind nicht verwandt.

So ist die Abfrage falsch, die eine Verbindung zwischen den zwei Ansichten zeigt, die principal_id verwenden.

+1

danke für Ihre Antwort. Ich habe noch eine weitere Frage: Der Kommentar in meinem Link besagt, dass der Zweck der Abfrage darin besteht, Server-Logins mit dem entsprechenden Datenbankbenutzer abzugleichen. Und genau das versuche ich zu tun. Wenn ich jedoch die modifizierte Abfrage ausführe (habe die innere Verknüpfung auf SID geändert), kann ich meine Anmeldung und den zugeordneten DB-Benutzer nicht abrufen. Lassen Sie mich klarstellen, was ich wieder tun möchte: Wenn ich SELECT SYSTEM_USER ausführen, habe ich meine Windows-Anmeldung, und ich habe CURRENT_USER, ich habe Dbo. Ich versuche die Zuordnung zwischen diesen beiden zu finden. – tete

+0

Allerdings, obwohl ich meine Anmeldung in der server_principal Abfrage habe, gibt es niemanden mit der gleichen sid in database_principal. Also habe ich meine Spur verloren. Habe ich etwas falsch gemacht? Zum Beispiel, habe ich die Berechtigung, alle database_principal anzuzeigen? Mein Login ist unter der Serverrolle sysadmin – tete

+0

@tete - wenn Sie ein Mitglied von 'sysadmin' sind, dann treten alle Arten von seltsamen Regeln ein - Sie sind automatisch' dbo' in jeder Datenbank, ohne dass es irgendwelche Einträge in 'database_principals' gibt , zum Beispiel. –