Идентификаторы участников и идентификаторы безопасности

При создании кода, взаимодействующего с ядром SQL Server, необходимо знать о двух числах, используемых для внутреннего представления участника. Каждый участник имеет идентификатор (ID) и идентификатор безопасности (SID). Откуда берутся эти числа и что они означают, зависит от способа создания и типа данного участника (участник на уровне сервера или участник базы данных).

Идентификационный номер уровня сервера

При создании учетной записи SQL Server ей назначается идентификатор и идентификатор безопасности. В представлении каталога sys.server_principals они отображаются в столбцах principal_id и SID. Идентификатор (principal_id) определяет учетную запись как защищаемый объект в рамках сервера. SQL Server присваивает его учетной записи во время создания. После удаления учетной записи ее идентификационный номер используется повторно. Идентификатор безопасности SID определяет контекст безопасности учетной записи и является уникальным в пределах экземпляра сервера. Источник идентификатора безопасности зависит от способа создания учетной записи. Если учетная запись создается пользователем или группой Windows, ей присваивается идентификатор безопасности Windows, принадлежащий исходному участнику. Идентификаторы безопасности Windows являются уникальными в пределах домена. Если учетная запись SQL Server создается из сертификата или асимметричного ключа, то присваиваемый ей идентификатор безопасности извлекается из хэша SHA-1 открытого ключа. Если учетная запись создается как имя входа SQL Server для прежних версий, для которого требуется пароль, то идентификатор безопасности создается сервером.

Идентификационный номер уровня базы данных

При создании пользователя базы данных ему назначается идентификатор и идентификатор безопасности. В представлении каталога sys.database_principals эти значения отображаются в столбцах principal_id и SID. Идентификатор определяет пользователя как защищаемый объект в рамках базы данных. После удаления пользователя базы данных его идентификационный номер используется повторно. Идентификатор безопасности, присвоенный пользователю базы данных, является уникальным в рамках этой базы данных. Источник идентификатора безопасности зависит от способа создания пользователя базы данных. Если пользователь создается из учетной записи SQL Server, ему присваивается идентификатор безопасности этой учетной записи. Если пользователь создается из сертификата или асимметричного ключа, присваиваемый ему идентификатор безопасности извлекается из хэша SHA-1 открытого ключа.

Максимальное количество пользователей базы данных

Максимальное количество пользователей базы данных ограничивается размером поля идентификаторов. Значение идентификатора должно быть равно нулю или представлено положительным целым числом. В SQL Server 2000 идентификатор пользователя хранился в виде переменной с типом smallint длиной в 16 байт, при этом один из байтов определял знак. Поэтому максимальное число идентификаторов пользователей в SQL Server 2000 равно 215 = 32 768. В SQL Server 2005 и более поздних версиях идентификатор пользователя хранится в виде переменной типа int длиной в 32 бита, один из которых определяет знак. Это дает возможность создания 231 = 2 147 483 648 идентификационных номеров.

Идентификаторы пользователей базы данных подразделяются на предварительно распределенные диапазоны, как показано в следующей таблице.

Идентификатор SQL Server 2000

Идентификатор SQL Server 2005

Диапазоны

0

0

public

1

1

dbo

2

2

guest

3

3

INFORMATION_SCHEMA

4

4

SYSTEM_FUNCTION_SCHEMA

5 - 16383

5 - 16383

Пользователи, псевдонимы, роли приложений

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

Зарезервирован

16400 - 32767

Роли

16400 - 2,147,483,647

Пользователи, роли, роли приложений, псевдонимы

Размер идентификатора пользователя увеличен с smallint (16 разрядов) до int (32 разряда). API-интерфейсы, работавшие с 16-разрядными идентификаторами пользователей, при обработке 32-разрядных идентификаторов пользователей возвращают неверные результаты. При переносе данных и приложений, созданных для SQL Server 2000 или более ранних версий, необходимо просмотреть исходный текст на предмет ссылок на следующие устаревшие интерфейсы.

  • sysusers

  • syscacheobjects

  • sysmembers

  • sysobjects

  • syspermissions

  • sysprocesses

  • sysprotects

  • systypes

  • USER_ID

Для этого интерфейса требуются 16-разрядные идентификаторы пользователей. Если идентификатор пользователя является 32-разрядным, интерфейс возвращает неверный результат.