

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 執行 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)
+ [將 SELECT 或 EXECUTE 權限授予 SYS 物件](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`  |  數字  |  —  |  是  |  工作階段識別符。  | 
|  `serial`  |  數字  |  —  |  是  |  工作階段的序號。  | 
|  `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`  |  數字  |  —  |  是  |  工作階段識別符。  | 
|  `serial`  |  數字  |  —  |  是  |  工作階段的序號。  | 
|  `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) 和 Oracle RDS 的所有較新的主要版本和次要版本支援此程序。

`cancel` 程序具有下列參數。


****  

| 參數名稱 | 資料類型 | 預設 | 必要 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `sid`  |  數字  |  —  |  是  |  工作階段識別符。  | 
|  `serial`  |  數字  |  —  |  是  |  工作階段的序號。  | 
|  `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)。

# 將 SELECT 或 EXECUTE 權限授予 SYS 物件
<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` 且擁有 GRANT OPTION 的使用者。

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

您必須使用 GRANT OPTION 或透過使用 `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` 存取的 `SYS.X$` 固定資料表。若要在合格 `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 Database 文件中未描述的內部系統物件。建議您在非生產資料庫中測試特定檢視，並且只在 Oracle Support 的指導下，在生產資料庫中建立檢視。

## 列出可在 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`  |  Boolean  | 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_CATALOG_ROLE` 角色可提供使用者資料字典檢視上的 `SELECT` 權限。下列範例會將角色 `SELECT_CATALOG_ROLE` 授予名為 `user1` 的使用者。

```
GRANT SELECT_CATALOG_ROLE TO user1;
```

您可以使用 `EXECUTE` 角色，將 `SYS` 權限授予 `EXECUTE_CATALOG_ROLE` 結構描述中的許多物件。`EXECUTE_CATALOG_ROLE` 角色可為使用者提供資料字典中套件和程序的 `EXECUTE` 權限。下列範例會將 `EXECUTE_CATALOG_ROLE` 角色授予名為「user1」**的使用者。

```
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`  |  數字  |  8  |  否  |  需要的字元數下限。  | 
|  `p_max_length`  |  數字  |  256  |  否  |  允許的字元數上限。  | 
|  `p_min_letters`  |  數字  |  1  |  否  |  需要的字母數下限。  | 
|  `p_min_uppercase`  |  數字  |  0  |  否  |  需要的大寫字母數下限。  | 
|  `p_min_lowercase`  |  數字  |  0  |  否  |  需要的小寫字母數下限。  | 
|  `p_min_digits`  |  數字  |  1  |  否  |  需要的數字下限。  | 
|  `p_min_special`  |  數字  |  0  |  否  |  需要的特殊字元數下限。  | 
|  `p_min_different_chars`  |  數字  |  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`。下列範例會將名為 的驗證 PL/SQL 函數`CUSTOM_PASSWORD_FUNCTION`與`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 錢包設定 UTL\$1HTTP 存取](Oracle.Concepts.ONA.md)。

Amazon RDS Oracle 允許透過客戶擁有的自訂 DNS 伺服器進行網域名稱服務 (DNS) 解析。您僅可以透過您的自訂 DNS 伺服器，解析來自您 Amazon RDS 資料庫執行個體的完整網域名稱。

設定您的自訂 DNS 名稱伺服器之後，需要最多 30 分鐘的時間，才能將變更傳播到您的資料庫執行個體。變更傳播到您的資料庫執行個體之後，所有傳出網路流量都需要透過連接埠 53 對您的 DNS 伺服器進行 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` 陳述式來設定事件。此 `ALTER SYSTEM` 陳述式並未記錄在 Oracle 資料庫文件中。某些系統診斷事件可能會產生大量的追蹤資訊、造成爭用或影響資料庫可用性。建議您在非生產資料庫中測試特定的診斷事件，並且只在 Oracle Support 的指導下，在生產資料庫中設定事件。

## 列出允許的系統診斷事件
<a name="Appendix.Oracle.CommonDBATasks.SystemEvents.listing"></a>

若要列出您可以設定的系統事件，請使用 Amazon RDS Procedure (程序)`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`  |  數字  |  —  |  是  |  系統事件編號。該值必須是由 `list_allowed_system_events` 報告的其中一個事件編號。  | 
|  `p_level`  |  數字  |  —  |  是  |  事件層級。如需不同層級值的說明，請參閱 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'`。

下列範例會在層級 3 設定事件 942，並在層級 10 設定事件 10442。包括範例輸出。

```
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`  |  數字  |  —  |  是  |  系統事件編號。該值必須是由 `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.
```