为什么我的 RDS for SQL Server 实例的主用户失去了访问权限,我怎样才能找回访问权限?

上次更新日期:2022 年 9 月 30 日

我的 Amazon Relational Database Service(Amazon RDS)for SQL Server 实例的主用户失去了访问权限。或者,我需要授予主用户访问其他用户创建的数据库的权限。我该怎么做才能恢复访问权限或向我的主用户授予访问权限?

简短描述

当您创建新的数据库实例时,默认主用户会自动获得该数据库实例的特定权限。创建数据库实例后,您无法更改主用户名。

注意:最佳做法是不要在应用程序中直接使用主用户。改为使用应用程序所需的最低权限创建的数据库用户。

如果您不小心删除了主用户的权限,则可以通过修改数据库实例和设置新的主用户密码来恢复这些权限。有关更多信息,请参阅主用户账户权限

解决方法

以下是可能导致主用户失去连接到数据库实例的访问权限的常见场景。或者主用户可能无法连接到和访问特定的用户数据库。

场景 1:由于显式拒绝,主用户无法连接到数据库实例

主用户可能无法连接到数据库实例,因为在 Connect SQL 权限上设置了显式拒绝。默认情况下,Amazon RDS 系统管理员(rdsa)登录名会向主用户授予连接 SQL 的权限。但是,在 Microsoft SQL Server 中,显式拒绝优先于显式授权

为解决此问题,请执行以下操作:

1.    使用授予者的登录名连接到 RDS for SQL Server,该授予者在主用户登录时在连接 SQL上设置了显式拒绝

2.    使用以下 T-SQL 命令撤消显式拒绝。在以下示例中,RDS 主用户登录名是 master_user,授予主体是 grantor_principal。更改这些值以匹配您的使用案例。

USE [master];
GO
REVOKE CONNECT SQL TO [master_user] AS [grantor_principal];
GO

场景 2:主用户无法连接到特定数据库,因为它没有映射到数据库中的用户

这可能发生在以下情况下:

  • 该数据库由另一个登录账户创建。而且,主用户登录名未映射到数据库中的数据库用户,也没有被授予数据库权限。
  • 先前映射到具有适当权限的主用户登录名的数据库用户已被显式删除。

要解决此问题,请重置主用户密码。重置密码会创建一个映射到主用户登录名的数据库用户(如果该用户被删除)。它还向用户授予 db_owner 固定数据库角色。有关重置主用户密码的说明,请参阅如何重置 Amazon RDS 数据库实例的主用户密码?

注意:重置密码的 AWS Identify and Access Management(IAM)用户必须有权在 RDS 资源上执行 ModifyDBInstance 操作。

更新主用户密码可执行以下操作:

  • 向主用户授予另一个用户创建的数据库的 db_owner 数据库级角色。
  • 恢复主用户的系统权限。
  • 恢复主用户的服务器级角色。
  • 恢复主用户的服务器级权限。
  • 恢复主用户对系统存储过程的访问权限。
  • 恢复主用户对 RDS 特定存储过程的访问权限。

场景 3:主用户无法执行某些操作

主用户拥有数据库的 db_owner 角色权限,但可以执行某些操作,例如 CONNECT、SELECT、INSERT、UPDATE、ALTER 等。当映射到主用户登录名的数据库用户被显式拒绝对数据库的某些权限时,可能会发生这种情况。

要查看数据库角色列表以及哪些数据库用户是这些角色的成员,请运行以下 T-SQL 命令。在下面的代码中,将 database_name 替换为您的使用案例的正确值。

USE [database_name];
  GO
  SELECT DP1.name AS DatabaseRoleName,
   isnull (DP2.name, 'No members') AS DatabaseUserName
 FROM sys.database_role_members AS DRM
 RIGHT OUTER JOIN sys.database_principals AS DP1
   ON DRM.role_principal_id = DP1.principal_id
 LEFT OUTER JOIN sys.database_principals AS DP2
   ON DRM.member_principal_id = DP2.principal_id
WHERE DP1.type = 'R'
ORDER BY DP1.name;

运行以下命令以查看用户在特定数据库中拥有的权限列表。在以下示例中,将 database_name 替换为您的使用案例的正确值。

USE [database_name];
GO
EXECUTE AS USER = 'master_user';
SELECT * FROM sys.fn_my_permissions(NULL, 'DATABASE');
GO

在此示例中,将主用户添加到 db_denydatawriterdb_denydatareader 固定数据库角色中。尽管是 db_owner 固定数据库角色的成员,但 db_denydatawriterdb_denydatareader 的拒绝权限禁止在数据库上使用 SELECT、INSERT、UPDATE 和 DELETE 权限。

要解决此问题,请执行以下操作:

1.    使用主用户登录到 RDS for SQL Server 实例。

2.    使用以下 T-SQL 命令将主用户作为这两个角色的成员删除:

USE [database_name];
GO
ALTER ROLE [db_denydatawriter] DROP MEMBER [master_user];
ALTER ROLE [db_denydatareader] DROP MEMBER [master_user];
GO

命令完成后,主用户对恢复的数据库具有 SELECT、INSERT、UPDATE 和 DELETE 权限。

有关主用户拥有的特定角色的更多信息,请参阅主用户账户权限


这篇文章对您有帮助吗?


您是否需要账单或技术支持?