SQL Server 用户简介

本页面介绍 Cloud SQL 如何与 SQL Server 用户和角色配合使用。 通过 SQL Server 角色,您可以控制用户访问 SQL Server 实例时所具有的访问权限和能力。

如需了解如何创建和管理 Cloud SQL 用户,请参阅创建和管理用户

SQL Server 角色和用户

SQL Server 角色可以是单个角色,也可以充当一组角色。

用户是具有登录能力的角色(该角色具有 LOGIN 权限)。Cloud SQL 创建的所有角色都具有 LOGIN 权限,因此在 Cloud SQL 中,“角色”和“用户”这两个术语可以互换使用。但是,如果您使用客户端创建角色,则该角色不一定具有 LOGIN 权限。

所有 SQL Server 用户都必须拥有密码。因此,您不能使用缺少密码的用户登录。

超级用户和系统存储过程

由于 Cloud SQL for SQL Server 是一项代管式服务,因此它会限制对需要高级权限的特定系统存储过程和表的访问权限。在 Cloud SQL 中,您无法创建或访问具有超级用户权限的用户。

默认 SQL Server 用户

创建新的 Cloud SQL for SQL Server 实例时,系统会为您创建默认 sqlserver 用户,但您必须为其设置密码。

sqlserver 用户属于 CustomerDbRootRole 角色,其权限(特权)包括以下项:

  • ALTER ANY CONNECTION
  • ALTER ANY LOGIN
  • ALTER ANY SERVER ROLE
  • ALTER SERVER STATE
  • ALTER TRACE
  • CONNECT SQL
  • CREATE ANY DATABASE
  • CREATE SERVER ROLE
  • VIEW ANY DATABASE
  • VIEW ANY DEFINITION
  • VIEW SERVER STATE

如果您要对关联的服务器使用 cloudsql enable linked servers,则也可将该标志添加到实例。该标志向您的服务器授予以下权限:

  • ALTER ANY LINKED SERVER

授予服务器权限

当您使用任何 GRANT 命令授予权限时,必须将 CustomerDbRootRole 作为 grantor_principal 的值传递。

以下 GRANT ALTER ANY LOGIN 示例有效

GRANT ALTER ANY LOGIN TO [Account] AS CustomerDbRootRole

以下 GRANT ALTER ANY LOGIN 示例无效

GRANT ALTER ANY LOGIN TO [Account]

其他 SQL Server 用户

您可以创建其他 SQL Server 用户或角色。您使用 Cloud SQL 创建的所有用户都将被授予与 sqlserver 登录用户相同的数据库权限。但是,如果您使用其他流程创建用户(而不是使用 Cloud SQL 创建用户),则该用户不具备与客户管理员账号或 sqlserver 用户相同的权限。例如,如果您使用创建登录用户流程,并将登录用户添加到 CustomerDbRootRole 服务器角色,则该用户不具备与客户管理员账号或 sqlserver 用户相同的权限。因此,如果您希望用户拥有与 sqlserver 登录用户相同的数据库权限,则可以使用 Cloud SQL 创建用户。如要验证任何两个账号的权限差异,您可以使用以下函数:sys.fn_my_permissions

数据库导入:所有者权限

导入数据库时,根据所有者的类型,所有者的处理方式会有所不同,如下所示:

  • 对于非 sa 的现有登录用户:Cloud SQL 会保留该所有者,并创建一个名为 sqlserver 的用户,该用户与 sqlserver 登录用户对应。Cloud SQL 会向该 sqlserver 用户授予 CONTROLALTER ANY USER 权限。
  • 对于未知登录用户或系统创建的登录用户:Cloud SQL 会将数据库的所有权转移到 sqlserver 登录用户。

更改用户的权限

ALTER ROLE 命令可用于更改用户权限。如果您使用客户端创建新用户,则可以将其与其他角色关联或提供不同的权限。

问题排查

数据库访问错误

当您尝试访问自己创建的数据库时,作为您创建的用户,您会收到以下错误:

The server principal USERNAME is not able to access the
database DATABASE_NAME under the current security context.

可能的原因

该用户不是该数据库的成员。

可以尝试的操作

sqlserver 用户身份连接到数据库并添加新用户,然后为新用户授予数据库的 db_owner 角色。例如:

EXEC sp_adduser 'user';
EXEC sp_addrolemember 'db_owner', 'user'

后续步骤