如何解决 Amazon RDS for SQL Server 上的 SQL 命令和存储过程的权限问题?
我想解决权限问题,以便运行 SQL 命令、运行存储过程和管理 Amazon Relational Database Service (Amazon RDS) for Microsoft SQL Server。
简短描述
当您执行以下操作时,可能会收到权限错误:
- 运行 sp_updatestats、sp_configure 和 xp_cmdshell 等系统过程来配置和维护数据库。
- 运行自定义存储过程。
- 检索审计日志。
- 部署 SQL Server Integration Services (SSIS)。
- 使用 SQL Server Management Studio (SSMS)。
为了维护服务的稳定性、安全性和可管理性,Amazon RDS 或 SQL Server 不支持服务器级角色,例如 sysadmin。有关更多信息,请参阅 Microsoft SQL Server 安全性。
如果您的工作负载需要标准 RDS for SQL Server 不支持的功能,请使用 RDS Custom for SQL Server。要完全控制 SQL Server 数据库 (DB) 实例和操作系统 (OS),请使用 Amazon Elastic Compute Cloud (Amazon EC2) 上的 SQL Server。要比较 SQL Server 数据库的 Amazon EC2 和 Amazon RDS 之间的差异,请参阅在 Amazon EC2 和 Amazon RDS 之间进行选择。
解决方法
收到有关 sp_configure 和 RECONFIGURE 的错误
要管理服务器级配置,例如 sp_configure 和 RECONFIGURE,请使用数据库参数组。
**注意:**静态参数的更改需要重启数据库实例才能使参数生效。动态参数的更改,例如最大并行度 (MAXDOP),无需重启即可立即生效。有关性能参数的更多示例,请参阅为 Amazon RDS for SQL Server 配置性能参数的最佳实践。
收到有关 sp_updatestats 的错误
要解决 sp_updatestats 相关的问题,请使用以下解决方法之一:
-
运行以下命令来创建以 dbo 权限运行的包装程序:
CREATE PROCEDURE myRDS_updatestats WITH EXECUTE AS 'dbo' AS EXEC sp_updatestats GO -- Grant execute permission to the required user GRANT EXECUTE ON myRDS_updatestats TO <username> GO -
要更新数据库中所有表的统计信息,请运行以下命令将 UPDATE STATISTICS 与动态 SQL 结合使用:
USE [Database_Name] GO; DECLARE @sql nvarchar(MAX); SELECT @sql = (SELECT 'UPDATE STATISTICS ' + QUOTENAME(s.name) + '.' + QUOTENAME(o.name) + ' WITH FULLSCAN; ' AS [text()] FROM sys.objects o JOIN sys.schemas s ON o.schema_id = s.schema_id WHERE o.type = 'U' FOR XML PATH(''), TYPE).value('.', 'nvarchar(MAX)'); PRINT @sql EXEC (@sql) GO -
运行以下命令以使用 sp_MSforeachtable:
EXEC sp_MSforeachtable 'UPDATE STATISTICS ? WITH FULLSCAN'
如果包装程序失败,请检查数据库的所有者。发生失效转移事件、替换主机或扩展数据库实例类后,数据库所有权可能会从 rdsa 更改为 NT AUTHORITY\SYSTEM。
要解决此问题,请运行以下命令将数据库所有权更改回 rdsa:
EXEC msdb.dbo.rds_changedbowner_to_rdsa @dbname = 'YourDatabaseName';
有关维护任务的更多信息,请参阅如何在 Amazon RDS 中创建 SQL Server 维护任务?
无法启用或运行 xp_cmdshell
由于 Amazon RDS 是一项托管服务,因此您无权访问操作系统,也无法运行 xp_cmdshell 程序。
**注意:**show advanced options 参数的默认值为 false,但其运行值设置为 1。因此,您无需运行单独的 SQL 命令即可使用该参数。
如果您必须为工作负载运行 xp_cmdshell,请使用 RDS Custom for SQL Server 或 Amazon EC2 上的 Microsoft SQL Server。
OLE Automation 存储过程出错
为了保护实例的稳定性和安全性,以下存储过程在 Amazon RDS for SQL Server 中不可用:
- sp_OACreate
- sp_OADestroy
- sp_OAGetErrorInfo
- sp_OAGetProperty
- sp_OAMethod
- sp_OASetProperty
- sp_OAStop
请改用 RDS Custom for SQL Server,它允许您在 RDS 环境中自定义操作系统和数据库。
无法访问 SQL Server 审计日志
在 Amazon RDS for SQL Server 中,无法直接访问 fn_get_audit_file 标准 SQL Server 函数。相反,您必须使用 msdb.dbo.rds_fn_get_audit_file RDS 函数。
使用 msdb.dbo.rds_fn_get_audit_file 的命令示例:
SELECT * FROM msdb.dbo.rds_fn_get_audit_file( 'D:\rdsdbdata\SQLAudit\*.sqlaudit', DEFAULT, DEFAULT );
有关详细信息,请参阅对 SQL Server 审计的支持。
要查看保留文件夹中的审计记录,请运行以下查询:
SELECT * FROM msdb.dbo.rds_fn_get_audit_file( 'D:\rdsdbdata\SQLAudit\transmitted\*.sqlaudit', DEFAULT, DEFAULT );
sp_addmessage 的权限被拒绝
sp_addmessage 系统存储过程要求您有权访问 sysadmin 或 serveradmin 服务器角色。
由于 Amazon RDS 不允许您使用 sysadmin 或 serveradmin,因此请改为执行以下操作:
-
使用 THROW 语句引发自定义异常,无需在 sys.messages 中预定义消息:
THROW 50001, 'Custom error message for the application', 1; -
使用 RAISERROR 语句生成自定义错误消息。当您不指定 msg_id 时,RAISERROR 会引发错误编号为 50000 的错误:
RAISERROR ('Custom error message', 16, 1);
如果您的应用程序需要 sysadmin 角色来运行 sysadmin 或 serveradmin,请使用 Amazon RDS Custom for SQL Server。或者,在 EC2 实例上托管 SQL Server。有关详细信息,请参阅主用户账户权限。
遇到 SSIS 包部署失败的问题
确保与您的数据库实例关联的 AWS Identity and Access Management (IAM) 角色具有访问 Amazon Simple Storage Service (Amazon S3) 存储桶所需的权限。有关权限要求,请参阅将 Amazon RDS for SQL Server 数据库实例与 Amazon S3 集成。
数据库实例和 S3 存储桶必须位于同一 AWS 区域。如果它们位于不同的区域,则在与您的数据库实例相同的区域中创建一个新的 S3 存储桶。
对于数据流任务,必须将 BLOBTempStoragePath 和 BufferTempStoragePath 设置为以 D:\S3\ 开头的文件路径。
**注意:**确保用于文件连接的所有参数、变量和表达式都指向 D:\S3 文件夹。
有关更多信息,请参阅 Amazon RDS for SQL Server 中对 SQL Server Integration Services (SSIS) 的支持以及将 Amazon RDS for SQL Server 数据库实例与 Amazon S3 集成。
使用资源调控器
要为不同的用户和应用程序设置特定的资源配额和优先级,请使用资源调控器来控制数据库实例资源。您可以对工作负载使用 CPU、内存和物理 I/O 资源的方式设置特定的配额。
