

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

# 升級和使用 PLV8 擴充功能
<a name="PostgreSQL.Concepts.General.UpgradingPLv8"></a>

PLV8 是值得信賴的 JavaScript 語言擴充功能，適用於 PostgreSQL。您可用於存放的程序、觸發程序和可從 SQL 呼叫的其他程序性程式碼。所有目前版本的 PostgreSQL 都支援此語言擴充功能。

如果您使用 [PLV8](https://plv8.github.io/) 並將 PostgreSQL 升級至新的 PLV8 版本，即可立即利用新的擴充功能套件。執行下列步驟，同步目錄中繼資料與新版的 PLV8。這些步驟為選用，但強烈建議您完成步驟以避免中繼資料不符的警告。

升級程序會捨棄您現有的所有 PLV8 函數。因此，我們建議您在升級之前建立 RDS for PostgreSQL 資料庫執行個體的快照。如需詳細資訊，請參閱[為 Amazon RDS 的單一可用區域資料庫執行個體建立資料庫快照](USER_CreateSnapshot.md)。

**重要**  
從 PostgreSQL 第 18 版開始，Amazon RDS for PostgreSQL 將棄用 `plcoffee` 和 `plls` PostgreSQL 延伸模組。建議您在應用程式中停止使用 CoffeeScript 和 LiveScript，以確保您具有未來引擎版本升級的升級路徑。

**如何同步目錄中繼資料與新版 PLV8**

1. 確認您需要更新。若要執行此動作，請在已連接至執行個體的情況下，執行下列命令。

   ```
   SELECT * FROM pg_available_extensions WHERE name IN ('plv8','plls','plcoffee');
   ```

   如果結果包含一個已安裝之版本的值，而此版本的編號小於預設版本，則請繼續此程序來更新擴充功能套件。例如，下列結果集表示您應該更新。

   ```
   name    | default_version | installed_version |                     comment
   --------+-----------------+-------------------+--------------------------------------------------
   plls    | 2.1.0           | 1.5.3             | PL/LiveScript (v8) trusted procedural language
   plcoffee| 2.1.0           | 1.5.3             | PL/CoffeeScript (v8) trusted procedural language
   plv8    | 2.1.0           | 1.5.3             | PL/JavaScript (v8) trusted procedural language
   (3 rows)
   ```

1. 如果您尚未建立 RDS for PostgreSQL 資料庫執行個體的快照，請建立一個。建立快照時，您可以繼續執行下列步驟。

1. 取得資料庫執行個體中的 PLV8 函數計數，以驗證升級之後函數全部存在。例如，下列 SQL 查詢會傳回 PLV8、plcoffee 和 plls 中寫入的函數數目。

   ```
   SELECT proname, nspname, lanname 
   FROM pg_proc p, pg_language l, pg_namespace n
   WHERE p.prolang = l.oid
   AND n.oid = p.pronamespace
   AND lanname IN ('plv8','plcoffee','plls');
   ```

1. 使用 pg\$1dump 建立只含結構描述的傾印檔案。例如，在 `/tmp` 目錄中建立用戶端機器上的檔案。

   ```
   ./pg_dump -Fc --schema-only -U master postgres >/tmp/test.dmp
   ```

   此範例使用下列選項：
   + `-Fc` – 自訂格式
   + --schema-only – 僅傾印建立結構描述所需的命令 (我們案例中的函數)
   + `-U` – RDS 主要使用者名稱
   + `database` – 資料庫執行個體上的資料庫名稱

   如需有關 pg\$1dump 的詳細資訊，請參閱 PostgreSQL 文件中的 [pg\$1dump](https://www.postgresql.org/docs/current/static/app-pgdump.html )。

1. 擷取傾印檔案中存在的「CREATE FUNCTION」DDL 陳述式。下列範例使用 `grep` 命令擷取用於建立函數並儲存到檔案中的 DDL 陳述式。您將於後續步驟中使用此 ddl 來重新建立函數。

   ```
   ./pg_restore -l /tmp/test.dmp | grep FUNCTION > /tmp/function_list
   ```

   如需有關 pg\$1restore 的詳細資訊，請參閱 PostgreSQL 文件中的 [pg\$1restore](https://www.postgresql.org/docs/current/static/app-pgrestore.html)。

1. 捨棄函數和擴充功能。下列範例會捨棄任何以 PLV8 為基礎的物件。cascade 選項可確保捨棄任何相依物件。

   ```
   DROP EXTENSION plv8 CASCADE;
   ```

   如果 PostgreSQL 執行個體包含以 plcoffee 或 plls 為基礎的物件，請對這些擴充功能重複此步驟。

1. 建立擴充功能。下列範例會建立 plv8、plcoffee 和 plls 擴充功能。

   ```
   CREATE EXTENSION plv8;
   CREATE EXTENSION plcoffee;
   CREATE EXTENSION plls;
   ```

1. 使用傾印檔案和「驅動程式」檔案建立函數。

   下列範例會重新建立您先前擷取的函數。

   ```
   ./pg_restore -U master -d postgres -Fc -L /tmp/function_list /tmp/test.dmp
   ```

1. 使用以下查詢驗證是否已重新建立所有函數。

   ```
   SELECT * FROM pg_available_extensions WHERE name IN ('plv8','plls','plcoffee'); 
   ```

   PLV8 第 2 版會將以下額外的資料列新增至結果集：

   ```
       proname    |  nspname   | lanname
   ---------------+------------+----------
    plv8_version  | pg_catalog | plv8
   ```