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

Добавления: 14 апреля 2006 г.

При создании кода, взаимодействующего с ядром 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

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

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

  • sysusers
  • syscacheobjects
  • sysmembers
  • sysobjects
  • syspermissions
  • sysprocesses
  • sysprotects
  • systypes
  • USER_ID

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

См. также

Основные понятия

Участники

Другие ресурсы

sys.server_principals (Transact-SQL)
sys.database_principals (Transact-SQL)
USER_ID (Transact-SQL)
SUSER_SID (Transact-SQL)
CREATE LOGIN (Transact-SQL)
CREATE USER (Transact-SQL)

Справка и поддержка

Получение помощи по SQL Server 2005