SIDs und IDs

Beim Schreiben von Code für die Interaktion mit dem SQL Server-Modul sollten Sie auf zwei Nummern achten, die intern zur Darstellung von Prinzipalen verwendet werden. Jeder Prinzipal hat eine ID und eine Sicherheits-ID (SID). Die Bedeutung und Quelle dieser Nummern hängt davon ab, wie der Prinzipal erstellt wurde und ob es sich um einen Serverprinzipal oder um einen Datenbankprinzipal handelt.

ID auf Serverebene

Einem SQL Server-Anmeldenamen wird bei seiner Erstellung eine ID und eine SID zugewiesen. Diese werden in der sys.server_principals-Katalogsicht als principal_id und SID angezeigt. Durch die ID (principal_id) wird der Anmeldename als sicherungsfähiges Element innerhalb des Servers gekennzeichnet. Die ID wird von SQL Server beim Erstellen des Anmeldenamens zugewiesen. Wird ein Anmeldename gelöscht, wird die zugehörige ID-Nummer anschließend wiederverwendet. Durch die SID, die innerhalb der Serverinstanz eindeutig ist, wird der Sicherheitskontext des Anmeldenamens identifiziert. Die Quelle der SID hängt davon ab, wie der Anmeldename erstellt wird. Wenn der Anmeldename aus einem Windows-Benutzer oder einer Windows-Gruppe erstellt wird, erhält er die Windows-SID des Quellprinzipals; die Windows-SID ist innerhalb der Domäne eindeutig. Wird der SQL Server-Anmeldename aus einem Zertifikat oder einem asymmetrischen Schlüssel erstellt, wird ihm eine aus dem SHA-1-Hash des öffentlichen Schlüssels abgeleitete SID zugewiesen. Wenn der Anmeldename als herkömmlicher SQL Server-Anmeldename erstellt wird, für den ein Kennwort erforderlich ist, wird vom Server eine SID generiert.

ID auf Datenbankebene

Einem Datenbankbenutzer wird bei seiner Erstellung eine ID und eine Sicherheits-ID (SID) zugewiesen. Diese Nummern werden in der sys.server_principals-Katalogsicht als principal_id und SID angezeigt. Anhand der ID wird der Benutzer als sicherungsfähiges Element innerhalb der Datenbank identifiziert. Wird ein Datenbankbenutzer gelöscht, wird die zugehörige ID anschließend wiederverwendet. Die einem Datenbankbenutzer zugewiesene SID ist innerhalb der Datenbank eindeutig. Die Quelle der SID hängt davon ab, wie der Datenbankbenutzer erstellt wird. Wenn der Benutzer aus einem SQL Server-Anmeldenamen erstellt wird, wird ihm die SID des Anmeldenamens zugewiesen. Wird der Benutzer aus einem Zertifikat oder einem asymmetrischen Schlüssel erstellt, wird die SID aus dem SHA-1-Hash des öffentlichen Schlüssels abgeleitet.

Maximale Anzahl von Datenbankbenutzern

Die maximale Anzahl von Datenbankbenutzern wird durch die Größe des Benutzer-ID-Felds bestimmt. Der Wert einer Benutzer-ID muss null oder eine positive ganze Zahl sein. In SQL Server 2000 wird die Benutzer-ID als ein aus 16 Bits (einschließlich Vorzeichen) bestehender smallint-Wert gespeichert. Aus diesem Grund ist die maximale Anzahl von Benutzer-IDs in SQL Server 2000 215 = 32.768. In SQL Server 2005 und höheren Versionen wird die Benutzer-ID als ein 32 Bit großer int-Wert (einschließlich Vorzeichen) gespeichert. Durch diese zusätzlichen Bits können 231 = 2.147.483.648 ID-Nummern zugewiesen werden.

Datenbankbenutzer-IDs werden, wie in der folgenden Tabelle veranschaulicht, in fest zugewiesene Bereiche eingeteilt.

SQL Server 2000 ID

SQL Server 2005 ID

Zuordnung

0

0

public

1

1

dbo (dbo)

2

2

Gast (guest)

3

3

INFORMATION_SCHEMA

4

4

SYSTEM_FUNCTION_SCHEMA

5 - 16383

5 - 16383

Benutzer, Aliase, Anwendungsrollen

16384

16384

db_owner

16385

16385

db_accessadmin

16386

16386

db_securityadmin

16387

16387

db_ddladmin

16389

16389

db_backupoperator

16390

16390

db_datareader

16391

16391

db_datawriter

16392

16392

db_denydatareader

16393

16393

db_denydatawriter

16394 - 16399

16394 - 16399

Reserviert

16400 - 32767

Rollen

16400 - 2,147,483,647

Benutzer, Rollen, Anwendungsrollen, Aliase

Die Größe von Benutzer-IDs wurde von smallint (16 Bits) auf int (32 Bits) erhöht. APIs, die eine 16-Bit-Benutzer-ID erfordern, geben falsche Ergebnisse zurück, wenn ihnen eine 32-Bit-Benutzer-ID übergeben wird. Bei der Migration von Daten und Anwendungen, die für SQL Server 2000 oder frühere Versionen erstellt wurden, sollten Sie den Code auf Verweise auf die folgenden, als veraltet markierten Schnittstellen überprüfen.

  • sysusers

  • syscacheobjects

  • sysmembers

  • sysobjects

  • syspermissions

  • sysprocesses

  • sysprotects

  • systypes

  • USER_ID

Diese Schnittstellen erfordern 16-Bit-Benutzer-IDs. Die Schnittstellen geben keine richtigen Ergebnisse zurück, wenn sie mit 32-Bit-Benutzer-IDs verwendet werden.