plsh
PL/sh 程序语言
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
plsh | 1.20220917 | LANG | MIT | C |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 3080 | plsh | 否 | 是 | 否 | 是 | 否 | 是 | - |
| 相关扩展 | plpgsql pg_cron pg_task pg_tle plperl plperlu plpython3u plv8 |
|---|
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | PGDG | 1.20220917 | 1817161514 | plsh | - |
| RPM | PGDG | 1.20220917 | 1817161514 | plsh_$v | - |
| DEB | PGDG | 1.20220917 | 1817161514 | postgresql-$v-plsh | - |
安装
您可以直接安装 plsh 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:
pig repo add pgdg -u # 添加 PGDG 仓库并更新缓存
使用 pig 或者是 apt/yum/dnf 安装扩展:
pig install plsh; # 当前活跃 PG 版本安装
pig ext install -y plsh -v 18 # PG 18
pig ext install -y plsh -v 17 # PG 17
pig ext install -y plsh -v 16 # PG 16
pig ext install -y plsh -v 15 # PG 15
pig ext install -y plsh -v 14 # PG 14
dnf install -y plsh_18 # PG 18
dnf install -y plsh_17 # PG 17
dnf install -y plsh_16 # PG 16
dnf install -y plsh_15 # PG 15
dnf install -y plsh_14 # PG 14
apt install -y postgresql-18-plsh # PG 18
apt install -y postgresql-17-plsh # PG 17
apt install -y postgresql-16-plsh # PG 16
apt install -y postgresql-15-plsh # PG 15
apt install -y postgresql-14-plsh # PG 14
创建扩展:
CREATE EXTENSION plsh;
用法
plsh 允许将 PostgreSQL 函数编写为 Shell 脚本。函数体必须以 shebang 行开头,指定解释器。
CREATE EXTENSION plsh;
创建 Shell 函数
CREATE FUNCTION concat(text, text) RETURNS text AS '
#!/bin/sh
echo "$1$2"
' LANGUAGE plsh;
SELECT concat('hello ', 'world'); -- 'hello world'
参数传递
函数参数作为位置 Shell 变量($1、$2 等)传递:
CREATE FUNCTION file_line_count(filename text) RETURNS int AS '
#!/bin/sh
wc -l < "$1"
' LANGUAGE plsh;
返回值
- 标准输出成为返回值(尾部换行符被去除)
- 空输出返回 NULL
- 标准错误输出会导致函数中止,并将其作为错误消息
- 非零退出状态会触发错误
CREATE FUNCTION system_uptime() RETURNS text AS '
#!/bin/sh
uptime
' LANGUAGE plsh;
数据库访问
不支持直接 SPI 访问,但由于 libpq 环境变量已预配置,可以使用 psql:
CREATE FUNCTION query_db(x int) RETURNS text AS $$
#!/bin/sh
psql -At -c "SELECT name FROM users WHERE id = $1"
$$ LANGUAGE plsh;
触发器函数
触发器上下文通过环境变量提供:
| 变量 | 说明 |
|---|---|
PLSH_TG_NAME | 触发器名称 |
PLSH_TG_WHEN | BEFORE、INSTEAD OF 或 AFTER |
PLSH_TG_LEVEL | ROW 或 STATEMENT |
PLSH_TG_OP | DELETE、INSERT、UPDATE 或 TRUNCATE |
PLSH_TG_TABLE_NAME | 目标表名 |
PLSH_TG_TABLE_SCHEMA | 目标表所在模式 |
事件触发器变量:PLSH_TG_EVENT、PLSH_TG_TAG。
内联执行
DO E'#!/bin/sh\necho "running shell command"' LANGUAGE plsh;
安全性
plsh 不应声明为 TRUSTED,因为 Shell 脚本在 PostgreSQL 用户权限下具有完全的操作系统级访问权限。只有超级用户应创建 plsh 函数。