SID 和 ID

如果要编写与 SQL Server 引擎进行交互的代码,则应该注意用作主体内部表示形式的两个号码。每个主体都具有一个 ID 和一个安全 ID (SID)。这些号码的含义和源取决于主体的创建方式,同时与主体是服务器主体还是数据库主体有关。

服务器级标识号

创建 SQL Server 登录名时,便会为它分配一个 ID 和一个 SID。这些号码在 sys.server_principals 目录视图中显示为 principal_id 和 SID。ID (principal_id) 将登录名标识为服务器上的安全对象。创建登录名时由 SQL Server 分配此 ID。删除登录名时,将回收其 ID 号。SID 标识登录名的安全上下文,并且在服务器实例中是唯一的。SID 的源取决于登录名的创建方式。如果通过 Windows 用户或组创建登录名,则会为它指定源主体的 Windows SID;Windows SID 在域中是唯一的。如果通过证书或非对称密钥创建 SQL Server 登录名,则会为它分配源自公钥的 SHA-1 哈希的 SID。如果按照需要密码的、早期样式的 SQL Server 登录名创建登录名,则服务器将生成一个 SID。

数据库级标识号

创建数据库用户时,便会为它分配一个 ID 和一个安全 ID (SID)。这些号码在 sys.database_principals 目录视图中显示为 principal_id 和 SID。ID 将用户标识为数据库中的安全对象。删除数据库用户时,将回收其 ID。分配给数据库用户的 SID 在数据库中是唯一的。SID 的源取决于数据库用户的创建方式。如果通过 SQL Server 登录名创建用户,则会为它指定登录名的 SID。如果通过证书或非对称密钥创建用户,则 SID 源自公钥的 SHA-1 哈希。

最大数据库用户数

最大数据库用户数由用户 ID 字段的大小确定。用户 ID 的值必须为零或正整数。在 SQL Server 2000 中,用户 ID 存储为 16 位的 smallint(其中一位是符号)。因此,SQL Server 2000 中最大用户 ID 数是 215 = 32,768。在 SQL Server 2005 及更高版本中,用户 ID 存储为 32 位的 int(其中一位是符号)。这些附加的位可以分配 231 = 2,147,483,648 个 ID。

数据库用户 ID 划分为预分配的范围,如下表中所示。

SQL Server 2000 ID

SQL Server 2005 ID

分配对象

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

用户、角色、应用程序角色、别名

用户 ID 大小从 smallint(16 位)增加到 int(32 位)。如果传递的是 32 位用户 ID,则要求使用 16 位用户 ID 的 API 将返回错误结果。当迁移为 SQL Server 2000 或早期版本创建的数据和应用程序时,应检查代码是否引用了以下不推荐使用的接口。

  • sysusers

  • syscacheobjects

  • sysmembers

  • sysobjects

  • syspermissions

  • sysprocesses

  • sysprotects

  • systypes

  • USER_ID

这些接口需要 16 位用户 ID。当使用 32 位用户 ID 时,这些接口将返回错误结果。