

# 执行 Oracle 数据库实例的常见系统任务
<a name="Appendix.Oracle.CommonDBATasks.System"></a>

下文中介绍了如何在运行 Oracle 的 Amazon RDS 数据库实例上，执行与系统相关的特定常见 DBA 任务。为了提供托管服务体验，Amazon RDS 不允许通过 shell 访问数据库实例，而仅限访问某些需要高级权限的系统过程和表。

**Topics**
+ [断开会话连接](Appendix.Oracle.CommonDBATasks.DisconnectingSession.md)
+ [终止会话](Appendix.Oracle.CommonDBATasks.KillingSession.md)
+ [在会话中取消 SQL 语句](Appendix.Oracle.CommonDBATasks.CancellingSQL.md)
+ [启用和禁用受限制的会话](Appendix.Oracle.CommonDBATasks.RestrictedSession.md)
+ [刷新共享池](Appendix.Oracle.CommonDBATasks.FlushingSharedPool.md)
+ [向 SYS 对象授予 SELECT 或 EXECUTE 权限](Appendix.Oracle.CommonDBATasks.TransferPrivileges.md)
+ [撤销 SYS 对象的 SELECT 或 EXECUTE 权限](Appendix.Oracle.CommonDBATasks.RevokePrivileges.md)
+ [管理 Oracle 数据库实例的 RDS\$1X\$1 视图](Appendix.Oracle.CommonDBATasks.X-dollar.md)
+ [向非主用户授予权限](Appendix.Oracle.CommonDBATasks.PermissionsNonMasters.md)
+ [创建自定义函数来验证密码](Appendix.Oracle.CommonDBATasks.CustomPassword.md)
+ [设置自定义 DNS 服务器](#Appendix.Oracle.CommonDBATasks.CustomDNS)
+ [设置和取消设置系统诊断事件](Appendix.Oracle.CommonDBATasks.SystemEvents.md)

# 断开会话连接
<a name="Appendix.Oracle.CommonDBATasks.DisconnectingSession"></a>

要终止专用服务器进程以断开当前会话连接，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.disconnect`。`disconnect` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `sid`  |  number  |  —  |  是  |  会话标识符。  | 
|  `serial`  |  number  |  —  |  是  |  会话的序列号。  | 
|  `method`  |  varchar  |  'IMMEDIATE'  |  否  |  有效值为 `'IMMEDIATE'` 或 `'POST_TRANSACTION'`。  | 

以下示例断开一个会话。

```
begin
    rdsadmin.rdsadmin_util.disconnect(
        sid    => sid, 
        serial => serial_number);
end;
/
```

要获取会话标识符和会话序列号，请查询 `V$SESSION` 视图。以下示例获取用户 `AWSUSER` 的所有会话。

```
SELECT SID, SERIAL#, STATUS FROM V$SESSION WHERE USERNAME = 'AWSUSER';
```

数据库必须处于打开状态，才能使用此方法。有关断开会话连接的更多信息，请参阅 Oracle 文档中的 [ALTER SYSTEM](http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_2014.htm#SQLRF53166)。

# 终止会话
<a name="Appendix.Oracle.CommonDBATasks.KillingSession"></a>

要终止会话，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.kill`。`kill` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `sid`  |  number  |  —  |  是  |  会话标识符。  | 
|  `serial`  |  number  |  —  |  是  |  会话的序列号。  | 
|  `method`  |  varchar  |  null  |  否  |  有效值为 `'IMMEDIATE'` 或 `'PROCESS'`。如果您指定 `IMMEDIATE`，其效果与运行以下语句相同： <pre>ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE</pre> 如果您指定 `PROCESS`，将终止与会话关联的进程。仅当终止使用 `IMMEDIATE` 的会话失败时，才指定 `PROCESS`。  | 

要获取会话标识符和会话序列号，请查询 `V$SESSION` 视图。以下示例获取用户 *AWSUSER* 的所有会话。

```
SELECT SID, SERIAL#, STATUS FROM V$SESSION WHERE USERNAME = 'AWSUSER';
```

以下示例终止会话。

```
BEGIN
    rdsadmin.rdsadmin_util.kill(
        sid    => sid, 
        serial => serial_number,
        method => 'IMMEDIATE');
END;
/
```

以下示例终止与会话关联的进程。

```
BEGIN
    rdsadmin.rdsadmin_util.kill(
        sid    => sid, 
        serial => serial_number,
        method => 'PROCESS');
END;
/
```

# 在会话中取消 SQL 语句
<a name="Appendix.Oracle.CommonDBATasks.CancellingSQL"></a>

要在会话中取消 SQL 语句，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.cancel`。

**注意**  
Oracle Database 19c (19.0.0) 和 RDS for Oracle 的所有更高主要和次要版本均支持此过程。

`cancel` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `sid`  |  number  |  —  |  是  |  会话标识符。  | 
|  `serial`  |  number  |  —  |  是  |  会话的序列号。  | 
|  `sql_id`  |  varchar2  |  null  |  否  |  SQL 语句的 SQL 标识符。  | 

以下示例在会话中取消 SQL 语句。

```
begin
    rdsadmin.rdsadmin_util.cancel(
        sid    => sid, 
        serial => serial_number,
        sql_id => sql_id);
end;
/
```

要获取会话标识符、会话序列号和 SQL 语句的 SQL 标识符，请查询 `V$SESSION` 视图。以下示例获取用户 `AWSUSER` 的所有会话和 SQL 标识符。

```
select SID, SERIAL#, SQL_ID, STATUS from V$SESSION where USERNAME = 'AWSUSER';
```

# 启用和禁用受限制的会话
<a name="Appendix.Oracle.CommonDBATasks.RestrictedSession"></a>

要启用和禁用受限制的会话，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.restricted_session`。`restricted_session` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 是 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_enable`  |  布尔值  |  true  |  否  |  设置为 `true` 则启用受限制的会话；设置为 `false` 则禁用受限制的会话。  | 

以下示例介绍了如何启用和禁用受限制的会话。

```
/* Verify that the database is currently unrestricted. */

SELECT LOGINS FROM V$INSTANCE;
 
LOGINS
-------
ALLOWED

/* Enable restricted sessions */

EXEC rdsadmin.rdsadmin_util.restricted_session(p_enable => true);
 

/* Verify that the database is now restricted. */

SELECT LOGINS FROM V$INSTANCE;
 
LOGINS
----------
RESTRICTED
 

/* Disable restricted sessions */

EXEC rdsadmin.rdsadmin_util.restricted_session(p_enable => false);
 

/* Verify that the database is now unrestricted again. */

SELECT LOGINS FROM V$INSTANCE;
 
LOGINS
-------
ALLOWED
```

# 刷新共享池
<a name="Appendix.Oracle.CommonDBATasks.FlushingSharedPool"></a>

要刷新共享池，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.flush_shared_pool`。`flush_shared_pool` 过程没有参数。

以下示例刷新共享池。

```
EXEC rdsadmin.rdsadmin_util.flush_shared_pool;
```

## 刷新缓冲区缓存
<a name="Appendix.Oracle.CommonDBATasks.FlushingBufferCache"></a>

要刷新缓冲区缓存，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.flush_buffer_cache`。`flush_buffer_cache` 过程没有参数。

以下示例刷新缓冲区缓存。

```
EXEC rdsadmin.rdsadmin_util.flush_buffer_cache;
```

## 刷新数据库智能闪存缓存
<a name="Appendix.Oracle.CommonDBATasks.flushing-shared-pool"></a>

要刷新数据库智能闪存缓存，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.flush_flash_cache`。`flush_flash_cache` 过程没有参数。以下示例刷新数据库智能闪存缓存。

```
EXEC rdsadmin.rdsadmin_util.flush_flash_cache;
```

有关将数据库智能闪存缓存与 RDS for Oracle 结合使用的更多信息，请参阅 [在 RDS for Oracle 实例存储中存储临时数据](CHAP_Oracle.advanced-features.instance-store.md)。

# 向 SYS 对象授予 SELECT 或 EXECUTE 权限
<a name="Appendix.Oracle.CommonDBATasks.TransferPrivileges"></a>

通常，您使用可包含多个对象的角色来传输权限。要为单个对象授予权限，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.grant_sys_object`。此过程仅授予已通过角色或直接授权授予主用户的权限。

`grant_sys_object` 过程具有以下参数。

**重要**  
对于所有参数值，除非您使用区分大小写的标识符创建了用户，否则请使用大写字母。例如，如果您运行 `CREATE USER myuser` 或 `CREATE USER MYUSER`，则数据字典将存储 `MYUSER`。但是，如果您在 `CREATE USER "MyUser"` 中使用双引号，则数据字典将存储 `MyUser`。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_obj_name`  |  varchar2  |  —  |  是  |  要授予其权限的对象的名称。对象可以是目录、函数、包、过程、序列、表或视图。对象名称的拼写必须与其在 `DBA_OBJECTS` 中出现时的拼写完全相同。由于大多数系统对象都是用大写形式定义的，因此，建议您先尝试这样做。  | 
|  `p_grantee`  |  varchar2  |  —  |  是  |  要向其授予权限的对象的名称。对象可以是架构或角色。  | 
|  `p_privilege`  |  varchar2  |  null  |  是  |  —  | 
|  `p_grant_option`  |  布尔值  |  false  |  否  |  设置为 `true`，则使用 with grant option。  | 

以下示例将名为 `V_$SESSION` 的对象的 select 权限授予名为 `USER1` 的用户。

```
begin
    rdsadmin.rdsadmin_util.grant_sys_object(
        p_obj_name  => 'V_$SESSION',
        p_grantee   => 'USER1',
        p_privilege => 'SELECT');
end;
/
```

以下示例使用授予选项将名为 `V_$SESSION` 的对象的 select 权限授予名为 `USER1` 的用户。

```
begin
    rdsadmin.rdsadmin_util.grant_sys_object(
        p_obj_name     => 'V_$SESSION',
        p_grantee      => 'USER1',
        p_privilege    => 'SELECT',
        p_grant_option => true);
end;
/
```

要能够授予针对某个对象的权限，您的账户必须具有通过使用授权选项或通过使用 `with admin option` 授予的角色直接为其授予的这些权限。在最常见的情况下，您可能希望授予已授予给 `SELECT` 角色的针对 DBA 视图的 `SELECT_CATALOG_ROLE` 权限。如果尚未使用 `with admin option` 将该角色直接授予您的用户，则您将无法转让此权限。如果您具有 DBA 权限，则可直接将该角色授予其他用户。

以下示例将 `SELECT_CATALOG_ROLE` 和 `EXECUTE_CATALOG_ROLE` 授予 `USER1`。由于使用了 `with admin option`，因此，`USER1` 现在可向已获得 `SELECT_CATALOG_ROLE` 的 SYS 对象授予访问权。

```
GRANT SELECT_CATALOG_ROLE TO USER1 WITH ADMIN OPTION; 
GRANT EXECUTE_CATALOG_ROLE to USER1 WITH ADMIN OPTION;
```

无需对已获得 `PUBLIC` 的对象重新授权。如果您使用 `grant_sys_object` 过程重新授予访问权，则此过程调用将成功。

# 撤销 SYS 对象的 SELECT 或 EXECUTE 权限
<a name="Appendix.Oracle.CommonDBATasks.RevokePrivileges"></a>

要撤销单个对象的特权，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.revoke_sys_object`。该过程仅撤消已通过角色或直接授权授予主账户的权限。

`revoke_sys_object` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_obj_name`  |  varchar2  |  —  |  是  |  要撤销其权限的对象的名称。对象可以是目录、函数、包、过程、序列、表或视图。对象名称的拼写必须与其在 `DBA_OBJECTS` 中出现时的拼写完全相同。由于大多数系统对象都是用大写形式定义的，因此，建议您先尝试这样做。  | 
|  `p_revokee`  |  varchar2  |  —  |  是  |  要撤销其权限的对象的名称。对象可以是架构或角色。  | 
|  `p_privilege`  |  varchar2  |  null  |  是  |  —  | 

以下示例从名为 `V_$SESSION` 的用户撤销名为 `USER1` 的对象的 select 权限。

```
begin
    rdsadmin.rdsadmin_util.revoke_sys_object(
        p_obj_name  => 'V_$SESSION',
        p_revokee   => 'USER1',
        p_privilege => 'SELECT');
end;
/
```

# 管理 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
```

# 向非主用户授予权限
<a name="Appendix.Oracle.CommonDBATasks.PermissionsNonMasters"></a>

您可以使用 `SYS` 角色向 `SELECT_CATALOG_ROLE` 架构中的多个对象授予 select 权限。`SELECT_CATALOG_ROLE` 角色向用户授予对数据字典视图的 `SELECT` 权限。以下示例向名为 `SELECT_CATALOG_ROLE` 的用户授予角色 `user1`。

```
GRANT SELECT_CATALOG_ROLE TO user1;
```

您可以使用 `EXECUTE` 角色向 `SYS` 架构中的多个对象授予 `EXECUTE_CATALOG_ROLE` 权限。`EXECUTE_CATALOG_ROLE` 角色向用户授予对数据字典中的包和过程的 `EXECUTE` 权限。以下示例向名为 *user1* 的用户授予角色 `EXECUTE_CATALOG_ROLE`。

```
GRANT EXECUTE_CATALOG_ROLE TO user1;
```

以下示例获取角色 `SELECT_CATALOG_ROLE` 和 `EXECUTE_CATALOG_ROLE` 允许的权限。

```
  SELECT * 
    FROM ROLE_TAB_PRIVS  
   WHERE ROLE IN ('SELECT_CATALOG_ROLE','EXECUTE_CATALOG_ROLE') 
ORDER BY ROLE, TABLE_NAME ASC;
```

以下示例将创建一个名为 `user1` 的非主用户，授予 `CREATE SESSION` 权限并授予对名为 *sh.sales* 的数据库的 `SELECT` 权限。

```
CREATE USER user1 IDENTIFIED BY PASSWORD;
GRANT CREATE SESSION TO user1;
GRANT SELECT ON sh.sales TO user1;
```

# 创建自定义函数来验证密码
<a name="Appendix.Oracle.CommonDBATasks.CustomPassword"></a>

您可以通过以下方式创建自定义密码验证函数：
+ 要使用标准验证逻辑，并将函数存储在 `SYS` 架构中，请使用 `create_verify_function` 过程。
+ 要使用自定义验证逻辑，或者避免将函数存储在 `SYS` 架构中，请使用 `create_passthrough_verify_fcn` 过程。

# create\$1verify\$1function 过程
<a name="Appendix.Oracle.CommonDBATasks.CustomPassword.Standard"></a>

您可以使用 Amazon RDS 过程 `rdsadmin.rdsadmin_password_verify.create_verify_function` 创建自定义函数来验证密码。所有版本的 RDS for Oracle 都支持 `create_verify_function` 过程。

`create_verify_function` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_verify_function_name`  |  varchar2  |  —  |  是  |  自定义函数的名称。将在 SYS 架构中为您创建此函数。为用户配置文件分配此函数。  | 
|  `p_min_length`  |  number  |  8  |  否  |  要求的字符的最小数量。  | 
|  `p_max_length`  |  number  |  256  |  否  |  允许的字符的最大数量。  | 
|  `p_min_letters`  |  number  |  1  |  否  |  要求的字母的最小数量。  | 
|  `p_min_uppercase`  |  number  |  0  |  否  |  要求的大写字母的最小数量。  | 
|  `p_min_lowercase`  |  number  |  0  |  否  |  要求的小写字母的最小数量。  | 
|  `p_min_digits`  |  number  |  1  |  否  |  要求的数字的最小数量。  | 
|  `p_min_special`  |  number  |  0  |  否  |  要求的特殊字符的最小数量。  | 
|  `p_min_different_chars`  |  number  |  3  |  否  |  旧密码和新密码之间需要的不同字符的最小数。  | 
|  `p_disallow_username`  |  布尔值  |  true  |  否  |  设置为 `true` 可禁止在密码中使用用户名。  | 
|  `p_disallow_reverse`  |  布尔值  |  true  |  否  |  设置为 `true` 则禁止在密码中使用反向用户名。  | 
|  `p_disallow_db_name`  |  布尔值  |  true  |  否  |  设置为 `true` 则禁止在密码中使用数据库或服务器名称。  | 
|  `p_disallow_simple_strings`  |  布尔值  |  true  |  否  |  设置为 `true` 则禁止将简单字符串用作密码。  | 
|  `p_disallow_whitespace`  |  布尔值  |  false  |  否  |  设置为 `true` 则禁止在密码中使用空格字符。  | 
|  `p_disallow_at_sign`  |  布尔值  |  false  |  否  |  设置为 `true` 以禁止在密码中使用 @ 字符。  | 

可以创建多个密码验证函数。

自定义函数的名称受到一些限制。您的自定义函数不能具有与现有系统对象相同的名称。名称长度不能超过 30 个字符。另外，名称必须包括以下字符串之一：`PASSWORD`、`VERIFY`、`COMPLEXITY`、`ENFORCE` 或 `STRENGTH`。

下面的示例创建一个名为 `CUSTOM_PASSWORD_FUNCTION` 的函数。此函数要求密码具有至少 12 个字符、2 个大写字符、1 个数字和 1 个特殊字符，并且该密码禁止使用 @ 字符。

```
begin
    rdsadmin.rdsadmin_password_verify.create_verify_function(
        p_verify_function_name => 'CUSTOM_PASSWORD_FUNCTION', 
        p_min_length           => 12, 
        p_min_uppercase        => 2, 
        p_min_digits           => 1, 
        p_min_special          => 1,
        p_disallow_at_sign     => true);
end;
/
```

要查看验证函数的文本，请查询 `DBA_SOURCE`。以下示例获取名为 `CUSTOM_PASSWORD_FUNCTION` 的自定义密码函数的文本。

```
COL TEXT FORMAT a150

  SELECT TEXT 
    FROM DBA_SOURCE 
   WHERE OWNER = 'SYS' 
     AND NAME = 'CUSTOM_PASSWORD_FUNCTION' 
ORDER BY LINE;
```

要将您的验证函数与用户配置文件关联，请使用 `ALTER PROFILE`。以下示例将名为 `CUSTOM_PASSWORD_FUNCTION` 的验证 PL/SQL 函数与 `DEFAULT` 用户配置文件关联。`PASSWORD_VERIFY_FUNCTION` 是 Oracle 配置文件资源名称。

```
ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION CUSTOM_PASSWORD_FUNCTION;
```

要查看哪些用户配置文件与哪些验证函数关联，请查询 `DBA_PROFILES`。以下示例获取与名为 `CUSTOM_PASSWORD_FUNCTION` 的自定义验证函数关联的配置文件。

```
SELECT * FROM DBA_PROFILES WHERE RESOURCE_NAME = 'PASSWORD_VERIFY_FUNCTION' AND LIMIT = 'CUSTOM_PASSWORD_FUNCTION';


PROFILE                    RESOURCE_NAME                     RESOURCE  LIMIT
-------------------------  --------------------------------  --------  ------------------------
DEFAULT                    PASSWORD_VERIFY_FUNCTION          PASSWORD  CUSTOM_PASSWORD_FUNCTION
```

以下示例获取所有配置文件以及与之关联的密码验证函数。

```
SELECT * FROM DBA_PROFILES WHERE RESOURCE_NAME = 'PASSWORD_VERIFY_FUNCTION';

PROFILE                    RESOURCE_NAME                     RESOURCE  LIMIT
-------------------------  --------------------------------  --------  ------------------------
DEFAULT                    PASSWORD_VERIFY_FUNCTION          PASSWORD  CUSTOM_PASSWORD_FUNCTION
RDSADMIN                   PASSWORD_VERIFY_FUNCTION          PASSWORD  NULL
```

# create\$1passthrough\$1verify\$1fcn 过程
<a name="Appendix.Oracle.CommonDBATasks.CustomPassword.Custom"></a>

所有版本的 RDS for Oracle 都支持 `create_passthrough_verify_fcn` 过程。

您可以使用 Amazon RDS 过程 `rdsadmin.rdsadmin_password_verify.create_passthrough_verify_fcn` 创建自定义函数来验证密码。`create_passthrough_verify_fcn` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_verify_function_name`  |  varchar2  |  —  |  是  |  自定义验证函数的名称。这是在 SYS 架构中为您创建的包装函数，它不包含任何验证逻辑。为用户配置文件分配此函数。  | 
|  `p_target_owner`  |  varchar2  |  —  |  是  |  自定义验证函数的架构所有者。  | 
|  `p_target_function_name`  |  varchar2  |  —  |  是  |  包含验证逻辑的现有自定义函数的名称。您的自定义函数必须返回布尔值。如果密码有效，您的函数应返回 `true`；如果密码无效应返回 `false`。  | 

以下示例创建的密码验证函数使用名为 `PASSWORD_LOGIC_EXTRA_STRONG` 的函数的逻辑。

```
begin
    rdsadmin.rdsadmin_password_verify.create_passthrough_verify_fcn(
        p_verify_function_name => 'CUSTOM_PASSWORD_FUNCTION', 
        p_target_owner         => 'TEST_USER',
        p_target_function_name => 'PASSWORD_LOGIC_EXTRA_STRONG');
end;
/
```

要将验证函数与用户配置文件关联，请使用 `alter profile`。以下示例将验证函数与 `DEFAULT` 用户配置文件关联。

```
ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION CUSTOM_PASSWORD_FUNCTION;
```

## 设置自定义 DNS 服务器
<a name="Appendix.Oracle.CommonDBATasks.CustomDNS"></a>

Amazon RDS 支持对运行 Oracle 的数据库实例进行出站网络访问。有关出站网络访问（包括先决条件）的更多信息，请参阅[使用证书和 Oracle Wallet 配置 UTL\$1HTTP 访问](Oracle.Concepts.ONA.md)。

Amazon RDS Oracle 支持通过客户拥有的自定义域名服务 (DNS) 服务器解析 DNS。通过自定义 DNS 服务器，您可以仅解析 Amazon RDS 数据库实例中的完全限定域名。

自定义 DNS 名称服务器设置完成后，它需要 30 分钟将更改传播到数据库实例中。将更改传播到数据库实例后，需要进行 DNS 查找的所有出站网络流量将通过端口 53 查询您的 DNS 服务器。

要为您的 Amazon RDS for Oracle 数据库实例设置自定义 DNS 服务器，请执行以下操作：
+ 在附加到 Virtual Private Cloud (VPC) 的 DHCP 选项集中，将 `domain-name-servers` 选项设置为您的 DNS 名称服务器的 IP 地址。有关更多信息，请参阅[ DHCP 选项集](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_DHCP_Options.html)。
**注意**  
`domain-name-servers` 选项最多可接受四个值，但您的 Amazon RDS 数据库实例只使用第一个值。
+ 请确保您的 DNS 服务器可以解析所有查找查询，包括公有 DNS 名称、Amazon EC2 私有 DNS 名称和特定客户的 DNS 名称。如果出站网络流量中包含您的 DNS 服务器不能处理的 DNS 查找，您的 DNS 服务器必须已配置适当的上游 DNS 提供程序。
+ 请配置您的 DNS 服务器，以生成等于或小于 512 字节的用户数据报协议 (UDP) 响应。
+ 请配置您的 DNS 服务器，以生成等于或小于 1024 字节的传输控制协议 (TCP) 响应。
+ 配置您的 DNS 服务器，允许流量通过 Amazon RDS 数据库实例的端口 53 入站。如果您的 DNS 服务器在 Amazon VPC 中，此 VPC 的安全组必须包含以下入站规则：允许端口 53 上的 UDP 和 TCP 流量。如果您的 DNS 服务器不在 Amazon VPC 中，它必须具有适当的防火墙允许名单，以允许端口 53 上的 UDP 和 TCP 入站流量。

  有关更多信息，请参阅[您的 VPC 的安全组](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)和[添加和删除规则](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules)。
+ 配置您的 Amazon RDS 数据库实例的 VPC，允许流量通过端口 53 出站。您的 VPC 安全组必须包含以下出站规则：允许端口 53 上的 UDP 和 TCP 流量。

  有关更多信息，请参阅[您的 VPC 的安全组](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)和[添加和删除规则](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules)。
+ 必须正确配置 Amazon RDS 数据库实例和 DNS 服务器之间的路由路径，允许 DNS 流量。
  + 如果 Amazon RDS 数据库实例和 DNS 服务器不在同一 VPC 中，必须在它们之间设置对等连接。有关更多信息，请参阅[什么是 VPC 对等连接？](https://docs.aws.amazon.com/vpc/latest/peering/Welcome.html) 

# 设置和取消设置系统诊断事件
<a name="Appendix.Oracle.CommonDBATasks.SystemEvents"></a>

要在会话级别设置和取消设置诊断事件，可以使用 Oracle SQL 语句 `ALTER SESSION SET EVENTS`。但是，要在系统级别设置事件，您不能使用 Oracle SQL。相反，请使用 `rdsadmin.rdsadmin_util` 软件包中的系统事件过程。以下引擎版本中提供系统事件过程：
+ 所有 Oracle Database 21c 版本
+ 19.0.0.0.ru-2020-10.rur-2020-10.r1 或更高的 Oracle Database 19c 版本

  有关更多信息，请参阅《Amazon RDS for Oracle 发布说明》**中的[版本 19.0.0.0.ru-2020-10.rur-2020-10.r1](https://docs.aws.amazon.com/AmazonRDS/latest/OracleReleaseNotes/oracle-version-19-0.html#oracle-version-RU-RUR.19.0.0.0.ru-2020-10.rur-2020-10.r1)

**重要**  
`rdsadmin.rdsadmin_util` 软件包内部使用 `ALTER SYSTEM SET EVENTS` 语句设置事件。Oracle 数据库文档中没有记录此 `ALTER SYSTEM` 语句。某些系统诊断事件可能会生成大量跟踪信息、引起争用或影响数据库可用性。我们建议您在非生产数据库中测试特定的诊断事件，并且在 Oracle 支持的指导下仅在生产数据库中设置事件。

## 列出允许的系统诊断事件
<a name="Appendix.Oracle.CommonDBATasks.SystemEvents.listing"></a>

要列出可以设置的系统事件，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.list_allowed_system_events`。此过程不接受任何参数。

以下示例列出了您可以设置的所有系统事件。

```
SET SERVEROUTPUT ON
EXEC rdsadmin.rdsadmin_util.list_allowed_system_events;
```

以下示例输出列出了事件编号及其描述。使用 Amazon RDS 过程 `set_system_event` 来设置这些事件并使用 `unset_system_event` 来取消设置它们。

```
604   - error occurred at recursive SQL level
942   - table or view does not exist
1401  - inserted value too large for column
1403  - no data found
1410  - invalid ROWID
1422  - exact fetch returns more than requested number of rows
1426  - numeric overflow
1427  - single-row subquery returns more than one row
1476  - divisor is equal to zero
1483  - invalid length for DATE or NUMBER bind variable
1489  - result of string concatenation is too long
1652  - unable to extend temp segment by  in tablespace
1858  - a non-numeric character was found where a numeric was expected
4031  - unable to allocate  bytes of shared memory ("","","","")
6502  - PL/SQL: numeric or value error
10027 - Specify Deadlock Trace Information to be Dumped
10046 - enable SQL statement timing
10053 - CBO Enable optimizer trace
10173 - Dynamic Sampling time-out error
10442 - enable trace of kst for ORA-01555 diagnostics
12008 - error in materialized view refresh path
12012 - error on auto execute of job
12504 - TNS:listener was not given the SERVICE_NAME in CONNECT_DATA
14400 - inserted partition key does not map to any partition
31693 - Table data object  failed to load/unload and is being skipped due to error:
```

**注意**  
允许的系统事件列表可能会随着时间的推移而变化。要确保您拥有最新的符合条件的活动列表，请使用 `rdsadmin.rdsadmin_util.list_allowed_system_events`。

## 设置系统诊断事件
<a name="Appendix.Oracle.CommonDBATasks.SystemEvents.setting"></a>

要设置系统事件，请使用Amazon RDS过程`rdsadmin.rdsadmin_util.set_system_event`。您只能设置 `rdsadmin.rdsadmin_util.list_allowed_system_events` 输出中列出的事件。`set_system_event` 过程接受以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_event`  |  number  |  —  |  是  |  系统事件编号。此值必须是 `list_allowed_system_events` 报告的事件编号之一。  | 
|  `p_level`  |  number  |  —  |  是  |  活动级别。有关不同级别值的说明，请参阅 Oracle 数据库文档或 Oracle 支持。  | 

过程 `set_system_event` 根据以下原则构造和运行所需的 `ALTER SYSTEM SET EVENTS` 语句：
+ 事件类型（`context` 或 `errorstack`）是自动确定的。
+ `ALTER SYSTEM SET EVENTS 'event LEVEL event_level'` 表单中的语句设置上下文事件。此符号等同于 `ALTER SYSTEM SET EVENTS 'event TRACE NAME CONTEXT FOREVER, LEVEL event_level'`。
+ `ALTER SYSTEM SET EVENTS 'event ERRORSTACK (event_level)'` 表单中的语句设置错误堆栈事件。此符号等同于 `ALTER SYSTEM SET EVENTS 'event TRACE NAME ERRORSTACK LEVEL event_level'`。

以下示例将事件 942 设置为级别 3，将事件 10442 设置为级别 10。示例输出包括在内。

```
SQL> SET SERVEROUTPUT ON
SQL> EXEC rdsadmin.rdsadmin_util.set_system_event(942,3);
Setting system event 942 with: alter system set events '942 errorstack (3)'

PL/SQL procedure successfully completed.

SQL> EXEC rdsadmin.rdsadmin_util.set_system_event(10442,10);
Setting system event 10442 with: alter system set events '10442 level 10'

PL/SQL procedure successfully completed.
```

## 列出设置的系统诊断事件
<a name="Appendix.Oracle.CommonDBATasks.SystemEvents.listing-set"></a>

要列出当前设置的系统事件，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.list_set_system_events`。此过程仅报告 `set_system_event` 在系统级别设置的事件。

以下示例列出了活动的系统事件。

```
SET SERVEROUTPUT ON
EXEC rdsadmin.rdsadmin_util.list_set_system_events;
```

以下示例输出显示了事件列表、事件类型、当前设置事件的级别以及设置事件的时间。

```
942 errorstack (3) - set at 2020-11-03 11:42:27
10442 level 10 - set at 2020-11-03 11:42:41

PL/SQL procedure successfully completed.
```

## 取消设置系统诊断事件
<a name="Appendix.Oracle.CommonDBATasks.SystemEvents.unsetting"></a>

要取消设置系统事件，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.unset_system_event`。您只能取消设置 `rdsadmin.rdsadmin_util.list_allowed_system_events` 输出中列出的事件。`unset_system_event` 过程接受以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_event`  |  number  |  —  |  是  |  系统事件编号。此值必须是 `list_allowed_system_events` 报告的事件编号之一。  | 

以下示例取消设置事件 942 和 10442。示例输出包括在内。

```
SQL> SET SERVEROUTPUT ON
SQL> EXEC rdsadmin.rdsadmin_util.unset_system_event(942);
Unsetting system event 942 with: alter system set events '942 off'

PL/SQL procedure successfully completed.

SQL> EXEC rdsadmin.rdsadmin_util.unset_system_event(10442);
Unsetting system event 10442 with: alter system set events '10442 off'

PL/SQL procedure successfully completed.
```