本页面介绍 Cloud SQL 如何与 SQL Server 用户和角色配合使用。 通过 SQL Server 角色,您可以控制用户访问 SQL Server 实例时所具有的访问权限和能力。
如需了解如何创建和管理 Cloud SQL 用户,请参阅创建和管理用户。
SQL Server 角色和用户
SQL Server 角色可以是单个角色,也可以充当一组角色。
用户是具有登录能力的角色(该角色具有 LOGIN
权限)。Cloud SQL 创建的所有角色都具有 LOGIN
权限,因此在 Cloud SQL 中,“角色”和“用户”这两个术语可以互换使用。但是,如果您使用与 SQL Server 兼容的任何客户端工具创建角色,则该角色不一定会获得 LOGIN
权限。
Cloud SQL for SQL Server 会限制对提供高级权限的特定服务器角色的访问。这些角色的示例包括 DbRootRole
、serveradmin
、securityadmin
、setupadmin
、diskadmin
和 dbcreator
。
所有 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
用户授予CONTROL
和ALTER 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'