

# 在 Amazon RDS 上使用 SSAS
<a name="SSAS.Use"></a>

部署 SSAS 项目后，您可以直接在 SSMS 上处理 OLAP 数据库。

**在 RDS 上使用 SSAS**

1. 在 SSMS 中，使用 Active Directory 域的用户名和密码连接到 SSAS。

1. 展开 **Databases (数据库)**。此时将显示新部署的 SSAS 数据库。

1. 找到连接字符串，再更新用户名和密码，以便有权访问源 SQL 数据库。处理 SSAS 对象必须要执行此操作。

   1. 针对表格模式执行以下操作：

      1. 展开 **Connections**（连接）选项卡。

      1. 打开连接对象的上下文（右键单击）菜单，然后选择 **Properties**（属性）。

      1. 更新连接字符串中的用户名和密码。

   1. 针对多维模式执行以下操作：

      1. 展开 **Data Sources**（数据源）选项卡。

      1. 打开数据源对象的上下文（右键单击）菜单，然后选择 **Properties**（属性）。

      1. 更新连接字符串中的用户名和密码。

1. 打开您创建的 SSAS 数据库的上下文（右键单击）菜单，然后选择 **Process Database (处理数据库)**。

   根据输入数据的大小，处理操作可能需要几分钟时间才能完成。

**Topics**
+ [为 SSAS 设置经 Windows 身份验证的用户](#SSAS.Use.Auth)
+ [添加域用户作为数据库管理员](#SSAS.Admin)
+ [创建 SSAS 代理](#SSAS.Use.Proxy)
+ [使用 SQL Server Agent 安排 SSAS 数据库处理](#SSAS.Use.Schedule)
+ [从代理撤消 SSAS 访问权限](#SSAS.Use.Revoke)

## 为 SSAS 设置经 Windows 身份验证的用户
<a name="SSAS.Use.Auth"></a>

主管理员用户（有时也被称为主用户）可以使用以下代码示例设置经 Windows 身份验证的登录并授予所需的过程权限。执行此操作可向域用户授予权限以运行 SSAS 客户任务、使用 S3 文件传输过程、创建凭证以及使用 SQL Server Agent 代理。有关更多信息，请参阅 Microsoft 文档中的[凭证（数据库引擎）](https://docs.microsoft.com/en-us/sql/relational-databases/security/authentication-access/credentials-database-engine?view=sql-server-ver15)和[创建 SQL Server Agent 代理](https://docs.microsoft.com/en-us/sql/ssms/agent/create-a-sql-server-agent-proxy?view=sql-server-ver15)。

您可以根据需要向经 Windows 身份验证的用户授予以下部分或所有权限。

**Example**  

```
-- Create a server-level domain user login, if it doesn't already exist
USE [master]
GO
CREATE LOGIN [mydomain\user_name] FROM WINDOWS
GO

-- Create domain user, if it doesn't already exist
USE [msdb]
GO
CREATE USER [mydomain\user_name] FOR LOGIN [mydomain\user_name]
GO

-- Grant necessary privileges to the domain user
USE [master]
GO
GRANT ALTER ANY CREDENTIAL TO [mydomain\user_name]
GO

USE [msdb]
GO
GRANT EXEC ON msdb.dbo.rds_msbi_task TO [mydomain\user_name] with grant option
GRANT SELECT ON msdb.dbo.rds_fn_task_status TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.rds_task_status TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.rds_cancel_task TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.rds_download_from_s3 TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.rds_upload_to_s3 TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.rds_delete_from_filesystem TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.rds_gather_file_details TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.sp_add_proxy TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.sp_update_proxy TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.sp_grant_login_to_proxy TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.sp_revoke_login_from_proxy TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.sp_delete_proxy TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.sp_enum_login_for_proxy to [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.sp_enum_proxy_for_subsystem TO [mydomain\user_name] with grant option
GRANT EXEC ON msdb.dbo.rds_sqlagent_proxy TO [mydomain\user_name] with grant option
ALTER ROLE [SQLAgentUserRole] ADD MEMBER [mydomain\user_name]
GO
```

## 添加域用户作为数据库管理员
<a name="SSAS.Admin"></a>

您可以通过以下方式，将域用户添加为 SSAS 数据库管理员：
+ 数据库管理员可以使用 SSMS 创建具有 `admin` 权限的角色，然后将用户添加到该角色。
+ 您可以使用以下存储过程。

  ```
  exec msdb.dbo.rds_msbi_task
  @task_type='SSAS_ADD_DB_ADMIN_MEMBER',
  @database_name='myssasdb',
  @ssas_role_name='exampleRole',
  @ssas_role_member='domain_name\domain_user_name';
  ```

  以下参数为必需参数：
  + `@task_type` – MSBI 任务的类型，在此例中为 `SSAS_ADD_DB_ADMIN_MEMBER`。
  + `@database_name` – 要向其授予管理员特权的 SSAS 数据库的名称。
  + `@ssas_role_name` – SSAS 数据库管理员角色名称。如果角色尚不存在，则会创建它。
  + `@ssas_role_member` – 要添加到管理员角色的 SSAS 数据库用户。

## 创建 SSAS 代理
<a name="SSAS.Use.Proxy"></a>

要先创建 SSAS 凭证和 SSAS 代理，才能使用 SQL Server Agent 来安排 SSAS 数据库处理。以经 Windows 身份验证的用户身份运行这些过程。

**创建 SSAS 凭证**
+ 为代理创建凭证。为此，您可以使用 SSMS 或以下 SQL 语句。

  ```
  USE [master]
  GO
  CREATE CREDENTIAL [SSAS_Credential] WITH IDENTITY = N'mydomain\user_name', SECRET = N'mysecret'
  GO
  ```
**注意**  
`IDENTITY` 必须是经域身份验证的登录名。将 `mysecret` 替换为经域身份验证的登录的密码。

**创建 SSAS 代理**

1. 使用以下 SQL 语句创建代理。

   ```
   USE [msdb]
   GO
   EXEC msdb.dbo.sp_add_proxy @proxy_name=N'SSAS_Proxy',@credential_name=N'SSAS_Credential',@description=N''
   GO
   ```

1. 使用以下 SQL 语句向其他用户授予对代理的访问权限。

   ```
   USE [msdb]
   GO
   EXEC msdb.dbo.sp_grant_login_to_proxy @proxy_name=N'SSAS_Proxy',@login_name=N'mydomain\user_name'
   GO
   ```

1. 使用以下 SQL 语句向代理授予 SSAS 子系统访问权限。

   ```
   USE [msdb]
   GO
   EXEC msdb.dbo.rds_sqlagent_proxy @task_type='GRANT_SUBSYSTEM_ACCESS',@proxy_name='SSAS_Proxy',@proxy_subsystem='SSAS'
   GO
   ```

**查看代理和代理上的授权**

1. 使用以下 SQL 语句查看代理的被授权者。

   ```
   USE [msdb]
   GO
   EXEC sp_help_proxy
   GO
   ```

1. 使用以下 SQL 语句查看子系统授权。

   ```
   USE [msdb]
   GO
   EXEC msdb.dbo.sp_enum_proxy_for_subsystem
   GO
   ```

## 使用 SQL Server Agent 安排 SSAS 数据库处理
<a name="SSAS.Use.Schedule"></a>

创建凭证和代理并向 SSAS 授予对代理的访问权限后，您可以创建 SQL Server Agent 任务来安排 SSAS 数据库处理。

**安排 SSAS 数据库处理**
+ 使用 SSMS 或 T-SQL 创建 SQL Server Agent 任务。以下示例使用 T-SQL。您可以通过 SSMS 或 T-SQL 进一步配置其任务计划。
  + `@command` 参数概述了将由 SQL Server Agent 任务运行的 XML for Analysis (XMLA) 命令。此示例配置了 SSAS 多维数据库处理。
  + `@server` 参数概述了 SQL Server Agent 任务的目标 SSAS 服务器名称。

    要在 SQL Server Agent 任务所在的同一 RDS 数据库实例中调用 SSAS 服务，请使用 `localhost:2383`。

    要从 RDS 数据库实例外部调用 SSAS 服务，请使用 RDS 端点。如果 RDS 数据库实例是由同一个域联接，则还可以使用 Kerberos Active Directory (AD) 端点 (`your-DB-instance-name.your-AD-domain-name`)。对于外部数据库实例，请确保正确配置与 RDS 数据库实例关联的 VPC 安全组，以便实现安全连接。

  您可以进一步编辑查询来支持各种 XMLA 操作。可以直接修改 T-SQL 查询进行编辑，也可以在创建 SQL Server Agent 任务后使用 SSMS UI 进行编辑。

  ```
  USE [msdb]
  GO
  DECLARE @jobId BINARY(16)
  EXEC msdb.dbo.sp_add_job @job_name=N'SSAS_Job', 
      @enabled=1, 
      @notify_level_eventlog=0, 
      @notify_level_email=0, 
      @notify_level_netsend=0, 
      @notify_level_page=0, 
      @delete_level=0, 
      @category_name=N'[Uncategorized (Local)]', 
      @job_id = @jobId OUTPUT
  GO
  EXEC msdb.dbo.sp_add_jobserver 
      @job_name=N'SSAS_Job', 
      @server_name = N'(local)'
  GO
  EXEC msdb.dbo.sp_add_jobstep @job_name=N'SSAS_Job', @step_name=N'Process_SSAS_Object', 
      @step_id=1, 
      @cmdexec_success_code=0, 
      @on_success_action=1, 
      @on_success_step_id=0, 
      @on_fail_action=2, 
      @on_fail_step_id=0, 
      @retry_attempts=0, 
      @retry_interval=0, 
      @os_run_priority=0, @subsystem=N'ANALYSISCOMMAND', 
      @command=N'<Batch xmlns="http://schemas.microsoft.com/analysisservices/2003/engine">
          <Parallel>
              <Process xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                  xmlns:ddl2="http://schemas.microsoft.com/analysisservices/2003/engine/2" xmlns:ddl2_2="http://schemas.microsoft.com/analysisservices/2003/engine/2/2" 
                  xmlns:ddl100_100="http://schemas.microsoft.com/analysisservices/2008/engine/100/100" xmlns:ddl200="http://schemas.microsoft.com/analysisservices/2010/engine/200" 
                  xmlns:ddl200_200="http://schemas.microsoft.com/analysisservices/2010/engine/200/200" xmlns:ddl300="http://schemas.microsoft.com/analysisservices/2011/engine/300" 
                  xmlns:ddl300_300="http://schemas.microsoft.com/analysisservices/2011/engine/300/300" xmlns:ddl400="http://schemas.microsoft.com/analysisservices/2012/engine/400" 
                  xmlns:ddl400_400="http://schemas.microsoft.com/analysisservices/2012/engine/400/400" xmlns:ddl500="http://schemas.microsoft.com/analysisservices/2013/engine/500" 
                  xmlns:ddl500_500="http://schemas.microsoft.com/analysisservices/2013/engine/500/500">
                  <Object>
                      <DatabaseID>Your_SSAS_Database_ID</DatabaseID>
                  </Object>
                  <Type>ProcessFull</Type>
                  <WriteBackTableCreation>UseExisting</WriteBackTableCreation>
              </Process>
          </Parallel>
      </Batch>', 
      @server=N'localhost:2383', 
      @database_name=N'master', 
      @flags=0, 
      @proxy_name=N'SSAS_Proxy'
  GO
  ```

## 从代理撤消 SSAS 访问权限
<a name="SSAS.Use.Revoke"></a>

您可以使用以下存储过程撤消对 SSAS 子系统的访问权限并删除 SSAS 代理。

**撤消访问权限并删除代理**

1. 撤消子系统访问权限。

   ```
   USE [msdb]
   GO
   EXEC msdb.dbo.rds_sqlagent_proxy @task_type='REVOKE_SUBSYSTEM_ACCESS',@proxy_name='SSAS_Proxy',@proxy_subsystem='SSAS'
   GO
   ```

1. 撤消代理上的授权。

   ```
   USE [msdb]
   GO
   EXEC msdb.dbo.sp_revoke_login_from_proxy @proxy_name=N'SSAS_Proxy',@name=N'mydomain\user_name'
   GO
   ```

1. 删除代理。

   ```
   USE [msdb]
   GO
   EXEC dbo.sp_delete_proxy @proxy_name = N'SSAS_Proxy'
   GO
   ```