模块管理器

来自 PostgreSQL 维基
跳转到导航跳转到搜索


此页面包含历史信息或已弃用文章


注意:截至 2020 年,当前的扩展打包系统CREATE EXTENSION命令已弃用。


人们对 PostgreSQL 扩展/包/模块管理器一直很感兴趣。

我们希望有一些软件可以帮助用户和开发人员更轻松地安装和管理 PostgreSQL 的各种附加功能。

目前,安装附加组件的过程相当手动且繁琐。它通常需要命令行界面和/或超级用户访问权限。如果模块可以通过 SQL 独立使用,那就太好了。

最近,这个话题再次出现在 pgsql-hackers 邮件列表中


也许应该澄清一下扩展模块这些术语之间的区别?由于大众需求,这里使用模块一词。

概要

作为数据库用户

使用模块

使用 contrib.import() 函数导入所需的模块。

ljudmila=> select contrib.import('hstore');
... stuff ...
    import     
---------------
 INSTALL hstore
(1 row)

ljudmila=> select 'a=>3'::hstore;
  hstore  
----------
 "a"=>"3"
(1 row)


当用户第一次调用 import() 时,模块将安装到当前模式中。

作为数据库管理员

安装模块管理器和 contrib 模块

默认情况下,这会进入 contrib 模式。

postgres@mama:$ pg_module all >pg_module.sql
postgres@mama:$ psql
ljudmila=# \i pg_module.sql
BEGIN
... stuff ...
COMMIT
ljudmila=# set search_path=contrib; \d+
SET
                                      List of relations
 Schema  |        Name        | Type  |   Owner    |               Description               
---------+--------------------+-------+------------+-----------------------------------------
 contrib | pg_module          | table | pg_modules | modules, which can imported or deported
 contrib | pg_module_contents | table | pg_modules | module contents
 contrib | pg_module_usage    | view  | pg_modules | modules imported into schemas
(3 rows)

列出可用模块

ljudmila=# select * from modules.pg_module;
       modname       |               modimport               |            moddeport            
---------------------+---------------------------------------+---------------------------------
 pg_buffercache      | module_pg_buffercache_import()        | module_pg_buffercache_deport()
 pgrowlocks          | module_pgrowlocks_import()            | module_pgrowlocks_deport()
 tsearch2            | module_tsearch2_import()              | module_tsearch2_deport()
 moddatetime         | module_moddatetime_import()           | 
 pgcrypto            | module_pgcrypto_import()              | module_pgcrypto_deport()
 lo                  | module_lo_import()                    | module_lo_deport()
 seg                 | module_seg_import()                   | module_seg_deport()
 pgxml               | module_pgxml_import()                 | module_pgxml_deport()
 test_parser         | module_test_parser_import()           | module_test_parser_deport()
 tablefunc           | module_tablefunc_import()             | module_tablefunc_deport()
 cube                | module_cube_import()                  | module_cube_deport()
 timetravel          | module_timetravel_import()            | 
 chkpass             | module_chkpass_import()               | module_chkpass_deport()
 _int                | module__int_import()                  | module__int_deport()
 refint              | module_refint_import()                | 
 int_aggregate       | module_int_aggregate_import()         | module_int_aggregate_deport()
 pgstattuple         | module_pgstattuple_import()           | module_pgstattuple_deport()
 fuzzystrmatch       | module_fuzzystrmatch_import()         | module_fuzzystrmatch_deport()
 pg_freespacemap     | module_pg_freespacemap_import()       | module_pg_freespacemap_deport()
 dblink              | module_dblink_import()                | module_dblink_deport()
 isn                 | module_isn_import()                   | module_isn_deport()
 pageinspect         | module_pageinspect_import()           | module_pageinspect_deport()
 insert_username     | module_insert_username_import()       | 
 adminpack           | module_adminpack_import()             | module_adminpack_deport()
 ltree               | module_ltree_import()                 | module_ltree_deport()
 dict_int            | module_dict_int_import()              | module_dict_int_deport()
 autoinc             | module_autoinc_import()               | 
 btree_gist          | module_btree_gist_import()            | module_btree_gist_deport()
 dict_xsyn           | module_dict_xsyn_import()             | module_dict_xsyn_deport()
 pg_trgm             | module_pg_trgm_import()               | module_pg_trgm_deport()
 hstore              | module_hstore_import()                | module_hstore_deport()
 earthdistance       | module_earthdistance_import()         | module_earthdistance_deport()
 sslinfo             | module_sslinfo_import()               | module_sslinfo_deport()
(35 rows)

列出模块内容

ljudmila=# select * from modules.pg_module_contents where modname='tablefunc';
  modname  | sql_type |                     sql_identifier                     |  objid  | objsubid 
-----------+----------+--------------------------------------------------------+---------+----------
 tablefunc | FUNCTION | normal_rand(integer,double precision,double precision) | 6542867 |        0
 tablefunc | FUNCTION | crosstab(text)                                         | 6542868 |        0
 tablefunc | TYPE     | tablefunc_crosstab_2                                   | 6542871 |        0
 tablefunc | TYPE     | tablefunc_crosstab_3                                   | 6542874 |        0
 tablefunc | TYPE     | tablefunc_crosstab_4                                   | 6542877 |        0
 tablefunc | FUNCTION | crosstab2(text)                                        | 6542878 |        0
 tablefunc | FUNCTION | crosstab3(text)                                        | 6542879 |        0
 tablefunc | FUNCTION | crosstab4(text)                                        | 6542880 |        0
 tablefunc | FUNCTION | crosstab(text,integer)                                 | 6542881 |        0
 tablefunc | FUNCTION | crosstab(text,text)                                    | 6542882 |        0
 tablefunc | FUNCTION | connectby(text,text,text,text,integer,text)            | 6542883 |        0
 tablefunc | FUNCTION | connectby(text,text,text,text,integer)                 | 6542884 |        0
 tablefunc | FUNCTION | connectby(text,text,text,text,text,integer,text)       | 6542885 |        0
 tablefunc | FUNCTION | connectby(text,text,text,text,text,integer)            | 6542886 |        0
(14 rows)

显示模块按模式的使用情况

ljudmila=#  select * from modules.pg_module_usage;
 schema_name | module_name | module_order 
-------------+-------------+--------------
(0 rows)

授予用户模块使用权限

ljudmila=# grant usage on schema modules to atom;
GRANT

详细说明

用例

  • contrib安装内容
  • 从 [Pgfoundry] 安装内容
  • 安装用户自己的内容
  • 说服 ISP,模块很棒,可以轻松安装和安全使用

愿望/需求

✓ = 已完成,❤ = 进行中

✓ 允许普通用户安装模块

通过使用 SECURITY DEFINER 函数完成。基本上,模块导入/导出函数以超级用户身份运行,可以执行任何操作。必须授予角色对模块管理器模式的 USAGE 权限,以使他们能够使用模块。

按名称(并可选地按版本)安装模块

❤ 命令行界面,类似 apt-get 或 CPAN

✓ 事务性安装(模块要么成功安装,要么根本不安装)

✓ 应该能够知道哪些模块已安装

✓ 应该管理当前的 contrib 内容

支持数据库和扩展的多个版本

在用户指定的数据库/模式中创建和删除(以及更改)扩展

自动获取和编译并安装来自互联网的源代码扩展

模块来源:contrib、PgFoundry、用户

依赖管理(也安装依赖项)

卸载应该使用依赖项,而不是手写的 SQL 脚本

支持/集成 pg_dump/pg_restore;应该转储 import() 语句而不是对象

构建

当前状态

用户级模块管理器在 PL/PgSQL 中以 SQL 模式形式有一个原型实现。模式名称默认为 modules,但在模块管理器安装时可以配置。

在 Perl 中有一个命令行工具的原型实现,它有助于模块创建。这对于普通 SQL 用户来说不是必需的。

概念

模块是 SQL 对象的集合,可以一次创建或删除。

模块管理器是特定于 PostgreSQL 的工具,而不是特定于操作系统的工具。它应该处理与模块管理相关的所有任务

模块管理器有两个方面

  1. 普通数据库用户级别的访问:函数 import(modulename)install(modulename)uninstall(modulename)
  2. 数据库管理员级别的访问:函数 create_module()drop_module()analyze_module()

模块安装在本地系统(例如 Debian Linux)上,针对特定 PostgreSQL 版本。

每个模块都安装在它自己的目录中,例如

/usr/share/posteresql/8.3/modules/tablefunc-8.3.0/

路径结构

$base/postgresql/pg_version/modules/modulename-moduleversion/

其中

  • pg_version - postgresql 版本号(因此支持多个安装)
  • modulename - 唯一的模块名称(例如 hstore、tablefunc、newsysviews)
  • moduleversion - 类似 Debian 的版本号。对于 contrib,这可能应该与 PostgreSQL 版本匹配。

模块目录至少应包含

  • SQL 安装说明(文件 install.sql)
  • SQL 卸载说明(文件 uninstall.sql)
  • 模块信息(文件 module.xml) - 应该详细说明其内容

这将使实用程序更轻松地枚举已安装的模块。

安装后,扩展可以

  • 加载(安装在特定数据库/模式中)
  • 卸载(从特定数据库/模式中删除)
  • 升级(到新版本)

也许应该使用 CREATE、DROP 和 ALTER 这些词?

当前contrib问题

  • 所有内容都在一个目录中;匹配安装和卸载文件甚至查看可用文件很笨拙
  • 没有指定模块版本(或任何元数据)
  • 许多文件明确地将模式设置为 public
    • 无论如何,这是默认设置
    • 它要求用户编辑 SQL 文件以更改此设置
    • 如果要支持在任何模式中安装模块,这应该由模块管理器设置

建议

  • 将 contrib 中的所有内容移至 modules 目录中的适当目录/文件
  • 添加缺少的 module.xml 文件
  • 从 contrib 创建符号链接

另请参见