模块管理器
此页面包含历史信息或已弃用文章。
注意:截至 2020 年,当前的扩展打包系统和CREATE EXTENSION命令已弃用。
人们对 PostgreSQL 扩展/包/模块管理器一直很感兴趣。
我们希望有一些软件可以帮助用户和开发人员更轻松地安装和管理 PostgreSQL 的各种附加功能。
目前,安装附加组件的过程相当手动且繁琐。它通常需要命令行界面和/或超级用户访问权限。如果模块可以通过 SQL 独立使用,那就太好了。
最近,这个话题再次出现在 pgsql-hackers 邮件列表中
- 2008-04 pgsql-hackers 线程
- 2007-10 pgsql-hackers 线程
- 2006-05 pgsql-hackers 线程
- Tom Dunstan 的数据库所有者可安装模块补丁
- Dimitri Fontaine 的 PostgreSQL 扩展打包提案
也许应该澄清一下扩展、包和模块这些术语之间的区别?由于大众需求,这里使用模块一词。
概要
作为数据库用户
使用模块
使用 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 的工具,而不是特定于操作系统的工具。它应该处理与模块管理相关的所有任务
模块管理器有两个方面
- 普通数据库用户级别的访问:函数 import(modulename)、install(modulename) 和 uninstall(modulename)
- 数据库管理员级别的访问:函数 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 创建符号链接
另请参见
- User:Ziga/xpg_package - 类似性质的较旧文档