SQL Server数据库登录名和用户名的区别与联系

admin
SQL Server中,登录名是服务器级别的身份验证标识,用于连接实例;用户名是数据库级别的标识,用于在库内操作,登录名对应操作系统账户,决定能否登录;用户名决定对数据库对象的权限,两者的联系在于:一个登录名必须映射为数据库用户,才能在特定数据库中执行操作。

在SQL Server数据库的管理和维护中,经常会有新手遇到“用户 'xxx' 登录失败”或者“登录失败”的错误提示,这通常是因为混淆了登录名用户名这两个概念。

虽然它们在功能上都用于验证身份,但在SQL Server的架构中,它们扮演着不同的角色,拥有不同的作用域,本文将深入浅出地解析这两个概念的区别与联系。

核心概念的区别

登录名:服务器级别的通行证

登录名是用于连接到 SQL Server 实例的身份凭证,你可以把它想象成进入大楼的权限。

SQL Server数据库登录名和用户名的区别与联系

  • 作用域:服务器级别。
  • 存储位置:系统视图 sys.server_principals
  • 验证方式
    • Windows 身份验证:通常对应操作系统的账户(如域账号或本地账号)。
    • SQL Server 身份验证:由数据库管理员手动创建的账号(如经典的 sa 账号)。
  • 作用:只有拥有有效的登录名,用户才能通过网络连接到 SQL Server 服务。

用户名:数据库级别的钥匙

用户名是用于连接到 特定数据库的身份凭证,你可以把它想象成进入大楼内某个特定办公室的钥匙。

  • 作用域:数据库级别(一个登录名可以对应多个数据库中的不同用户名)。
  • 存储位置:系统视图 sys.database_principals
  • 映射关系:用户名必须映射到一个登录名,才能在数据库中生效。
  • 作用:用户名决定了你在该数据库中能做什么(如:是拥有 dbo 权限,还是只有 SELECT 权限)。

它们之间的联系:映射

这是理解两者的关键。登录名是“门”,用户名是“房”。

  1. 映射机制:在SQL Server中,一个有效的登录名必须映射到数据库内的一个用户,才能访问该数据库。
  2. 独立存在:登录名只存在于服务器实例中,而用户名存在于每一个具体的数据库中。
    • 你在服务器上创建了一个登录名 UserA,那么在 Master 库中你可以看到 UserA,但在 TestDB 库中,你需要创建一个名为 UserA 的用户并将其映射到该登录名。

常见场景与误区

用户名存在,但登录名不存在(孤立用户)

当你把一个数据库从服务器A复制到服务器B时,数据库里的用户名还在,但登录名丢了。

  • 现象:你可以打开数据库,但无法执行任何查询,报错提示“用户 'xxx' 无效”。
  • 解决:需要在服务器B上重新创建对应的登录名,然后使用 ALTER USER 将该用户重新映射到这个登录名。

登录名存在,但未映射到用户

你在服务器上创建了一个登录名 Admin,但是没有在 MyDatabase 库中创建对应的用户。

  • 现象Admin 可以连接到 SQL Server,但无法打开 MyDatabase,报错提示“用户 'Admin' 登录失败”。
文章版权声明:除非注明,否则均为xmsdn原创文章,转载或复制请以超链接形式并注明出处。

取消
微信二维码
微信二维码
支付宝二维码