

# 管理 Oracle 数据库实例的 RDS\$1X\$1 视图
<a name="Appendix.Oracle.CommonDBATasks.X-dollar"></a>

您可能需要访问 `SYS.X$` 固定表，这些表只能由 `SYS` 访问。要在符合条件的 `X$` 表上创建 `SYS.RDS_X$` 视图，请使用 `rdsadmin.rdsadmin_util` 包中的过程。您的主用户将自动获得对于 `RDS_X$` 视图的权限 `SELECT … WITH GRANT OPTION`。

`rdsadmin.rdsadmin_util` 过程适用于以下情况：
+ 从未升级过且使用以下版本的现有数据库实例：
  + `21.0.0.0.ru-2023-10.rur-2023-10.r1` 以及更高的 21c 版本
  + `19.0.0.0.ru-2023-10.rur-2023-10.r1` 以及更高的 19c 版本
+ 您创建的任何新的数据库实例
+ 您已升级的任何现有数据库实例

**重要**  
在内部，`rdsadmin.rdsadmin_util` 包在 `X$` 表上创建视图。`X$` 表是内部系统对象，Oracle 数据库文档中未对此进行描述。我们建议您在非生产数据库中测试特定的视图，并且在 Oracle 支持的指导下仅在生产数据库中创建视图。

## 列出符合条件在 RDS\$1X\$1 视图中使用的 X\$1 固定表
<a name="Appendix.Oracle.CommonDBATasks.list-allowed-X-dollar"></a>

要列出符合条件在 `RDS_X$` 视图中使用的 X\$1 表，请使用 RDS 过程 `rdsadmin.rdsadmin_util.list_allowed_sys_x$_views`。此过程不接受任何参数。以下语句列出了所有符合条件的 `X$` 表（包括示例输出）。

```
SQL> SET SERVEROUTPUT ON
SQL> SELECT * FROM TABLE(rdsadmin.rdsadmin_util.list_allowed_sys_x$_views);

'X$BH'
'X$K2GTE'
'X$KCBWBPD'
'X$KCBWDS'
'X$KGLLK'
'X$KGLOB'
'X$KGLPN'
'X$KSLHOT'
'X$KSMSP'
'X$KSPPCV'
'X$KSPPI'
'X$KSPPSV'
'X$KSQEQ'
'X$KSQRS'
'X$KTUXE'
'X$KQRFP'
```

符合条件的 `X$` 表的列表可能随时间推移而变化。要确保符合条件的 `X$` 固定表的列表是最新的，请定期重新运行 `list_allowed_sys_x$_views`。

## 创建 SYS.RDS\$1X\$1 视图
<a name="Appendix.Oracle.CommonDBATasks.create-X-dollar"></a>

要在符合条件的 `X$` 表上创建 `RDS_X$` 视图，请使用 RDS 过程 `rdsadmin.rdsadmin_util.create_sys_x$_view`。您只能为 `rdsadmin.rdsadmin_util.list_allowed_sys_x$_views` 的输出中列出的表创建视图。`create_sys_x$_view` 过程接受以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_x$_tbl`  |  varchar2  |  Null  |  是  |  有效的 `X$` 表名称。此值必须是 `list_allowed_sys_x$_views` 报告的 `X$` 表之一。  | 
|  `p_force_creation`  |  布尔值  | FALSE |  否  |  一个值，表示是否强制为 `X$` 表创建已存在的 `RDS_X$` 视图。默认情况下，如果视图已经存在，RDS 将不会创建该视图。要强制创建，请将此参数设置为 `TRUE`。  | 

下面的示例基于表 `X$KGLOB` 创建 `SYS.RDS_X$KGLOB` 视图。视图名称的格式为 `RDS_X$tablename`。

```
SQL> SET SERVEROUTPUT ON
SQL> EXEC rdsadmin.rdsadmin_util.create_sys_x$_view('X$KGLOB');

PL/SQL procedure successfully completed.
```

以下数据字典查询列出视图 `SYS.RDS_X$KGLOB` 并显示其状态。您的主用户将自动获得对该视图的 `SELECT ... WITH GRANT OPTION` 权限。

```
SQL> SET SERVEROUTPUT ON
SQL> COL OWNER FORMAT A30 
SQL> COL OBJECT_NAME FORMAT A30
SQL> COL STATUS FORMAT A30
SQL> SET LINESIZE 200
SQL> SELECT OWNER, OBJECT_NAME, STATUS 
FROM DBA_OBJECTS 
WHERE OWNER = 'SYS' AND OBJECT_NAME = 'RDS_X$KGLOB';

OWNER                          OBJECT_NAME                    STATUS
------------------------------ ------------------------------ ------------------------------
SYS                            RDS_X$KGLOB                    VALID
```

**重要**  
不能保证 `X$` 表在升级前后保持不变。在引擎升级期间，RDS for Oracle 会删除并重新创建 `X$` 表上的 `RDS_X$` 视图。然后它向主用户授予 `SELECT ... WITH GRANT OPTION` 权限。升级后，根据需要向数据库用户授予对相应 `RDS_X$` 视图的权限。

## 列出 SYS.RDS\$1X\$1 视图
<a name="Appendix.Oracle.CommonDBATasks.list-created-X-dollar"></a>

要列出现有 `RDS_X$` 视图，请使用 RDS 过程 `rdsadmin.rdsadmin_util.list_created_sys_x$_views`。该过程仅列出由过程 `create_sys_x$_view` 创建的视图。以下示例列出了具有相应 `RDS_X$` 视图的 `X$` 表（包括示例输出）。

```
SQL> SET SERVEROUTPUT ON
SQL> COL XD_TBL_NAME FORMAT A30
SQL> COL STATUS FORMAT A30
SQL> SET LINESIZE 200
SQL> SELECT * FROM TABLE(rdsadmin.rdsadmin_util.list_created_sys_x$_views);

XD_TBL_NAME                    STATUS
------------------------------ ------------------------------
X$BH                           VALID
X$K2GTE                        VALID
X$KCBWBPD                      VALID

3 rows selected.
```

## 删除 RDS\$1X\$1 视图
<a name="Appendix.Oracle.CommonDBATasks.drop-X-dollar"></a>

要删除 `SYS.RDS_X$` 视图，请使用 RDS 过程 `rdsadmin.rdsadmin_util.drop_sys_x$_view`。您只能删除 `rdsadmin.rdsadmin_util.list_allowed_sys_x$_views` 的输出中列出的视图。`drop_sys_x$_view` 过程接受以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_x$_tbl`  |  varchar2  |  Null  |  是  |  有效的 `X$` 固定表名称。此值必须是 `list_created_sys_x$_views` 报告的 `X$` 固定表之一。  | 

以下示例删除了在表 `X$KGLOB` 上创建的 `RDS_X$KGLOB` 视图。

```
SQL> SET SERVEROUTPUT ON
SQL> EXEC rdsadmin.rdsadmin_util.drop_sys_x$_view('X$KGLOB');

PL/SQL procedure successfully completed.
```

以下示例显示视图 `SYS.RDS_X$KGLOB` 已被删除（包括示例输出）。

```
SQL> SET SERVEROUTPUT ON
SQL> COL OWNER FORMAT A30 
SQL> COL OBJECT_NAME FORMAT A30
SQL> COL STATUS FORMAT A30
SQL> SET LINESIZE 200
SQL> SELECT OWNER, OBJECT_NAME, STATUS 
FROM DBA_OBJECTS 
WHERE OWNER = 'SYS' AND OBJECT_NAME = 'RDS_X$KGLOB';

no rows selected
```