升级和使用 PLV8 扩展
PLV8 是适用于 PostgreSQL 的可信 Javascript 语言扩展。您可以将其用于存储过程、触发条件和其他可从 SQL 调用的过程代码。PostgreSQL 的所有当前版本都支持此语言扩展。
如果使用 PLV8
升级过程会丢弃所有现有的 PLV8 功能。因此,建议您在升级之前创建 RDS for PostgreSQL 数据库实例的快照。有关更多信息,请参阅 为 Amazon RDS 的单可用区数据库实例创建数据库快照。
将目录元数据与新版本的 PLV8 同步
-
确认您需要更新。为此,请在连接到实例的情况下运行以下命令。
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)
如果尚未创建 RDS for PostgreSQL 数据库实例的快照,请先创建一个。创建快照时,您可以继续下列步骤。
-
获取数据库实例中 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');
-
使用 pg_dump 创建仅架构转储文件。例如,在客户端计算机上的
/tmp
目录中创建文件。./pg_dump -Fc --schema-only -U master postgres >/tmp/test.dmp
该示例使用以下选项:
-
-Fc
- 自定义格式 -
--仅架构 - 仅转储创建架构所需的命令(在本例中为功能)
-
-U
- RDS 主用户名 -
database
- 数据库实例的数据库名称
有关 pg_dump 的更多信息,请参阅 PostgreSQL 文档中的 pg_dump
。 -
-
提取位于转储文件中的“CREATE FUNCTION”DDL 语句。以下示例使用
grep
命令提取创建函数的 DDL 语句并将函数保存到文件中。将在后续步骤中使用该语句重新创建函数。./pg_restore -l /tmp/test.dmp | grep FUNCTION > /tmp/function_list/
有关 pg_restore 的更多信息,请参阅 PostgreSQL 文档中的 pg_restore
。 -
删掉函数和扩展。以下示例将删除基于 PLV8 的任何对象。级联选项确保删除任何依赖项。
DROP EXTENSION plv8 CASCADE;
如果您的 PostgreSQL 实例包含基于 plcoffee 或 plls 的对象,请对这些扩展重复此步骤。
-
创建扩展。以下示例将创建 plv8、plcoffee 和 plls 扩展。
CREATE EXTENSION plv8; CREATE EXTENSION plcoffee; CREATE EXTENSION plls;
-
使用转储文件和“驱动程序”文件创建函数。
以下示例将重新创建之前提取的函数。
./pg_restore -U master -d postgres -Fc -L /tmp/function_list /tmp/test.dmp
-
使用以下查询验证是否已重新创建所有函数。
SELECT * FROM pg_available_extensions WHERE name IN ('plv8','plls','plcoffee');
PLV8 版本 2 在结果集中添加以下额外行:
proname | nspname | lanname ---------------+------------+---------- plv8_version | pg_catalog | plv8