我很茫然,在我的本地 Postgres 服务器(postgres.app,Mac OS X 10.7)中创建存储进程时遇到问题,因此
$ psql
psql (9.3.0)
Type "help" for help.
dchaston=# CREATE OR REPLACE FUNCTION table_update()
dchaston-# RETURNS TRIGGER AS $$
dchaston$# BEGIN
dchaston$# NEW.last_edit = now();
dchaston$# RETURN NEW;
dchaston$# END;
dchaston$# $$ language 'plpgsql';
ERROR: could not access file "$libdir/plpgsql": No such file or directory
我已经检查了以下内容:
安装的语言:
dchaston=# select * from pg_language;
lanname | lanowner | lanispl | lanpltrusted | lanplcallfoid | laninline | lanvalidator | lanacl
---------+----------+---------+--------------+---------------+-----------+--------------+--------
internal | 10 | f | f | 0 | 0 | 2246 |
c | 10 | f | f | 0 | 0 | 2247 |
sql | 10 | f | t | 0 | 0 | 2248 |
plpgsql | 10 | t | t | 12019 | 12020 | 12021 |
(4 rows)
lib 目录(和 pkglibdir 以防万一):
$ pg_config --libdir
/Applications/Postgres.app/Contents/MacOS/lib
$ pg_config --pkglibdir
/Applications/Postgres.app/Contents/MacOS/lib
文件存在:
$ cd /Applications/Postgres.app/Contents/MacOS/lib; ls plpg*
plpgsql.so
DL后缀设置正确:
lib/pgxs/src/Makefile.shlib:135: DLSUFFIX = .so
尝试卸载并重新安装,但没有区别。有什么想法吗?
您是否在同一机器上安装了多个Postgres 实例(多个版本或同一版本的多个实例)?标准邮政不适合这样做。Debian 或 Ubuntu 有额外的基础设施来并行允许多个版本。不过,我不知道OS X。
在标准Postgres中,$libdir
的路径被编译到程序中。多个版本无法相处。
执行pg_config --pkglibdir
时,请确保它是与您的安装关联的那个。跑:
which pg_config
小注意事项:
9.3.0
?建议始终升级到最新的单点版本,即目前的 9.3.2。也许当前来源可以解决您的问题。此外,请检查您的设置是否正在使用您认为正在使用的
$libdir
:SELECT * FROM pg_settings WHERE name ~~* '%lib%';
不要
引用语言名称(尽管这是可以容忍的)。这是一个标识符:'plpgsql'
plpgsql
。使用 plpgsql 赋值运算符:=
。=
没有记录,但可以容忍。
从Postgres9.4开始,:=
和=
都被记录下来。
否则,您的函数定义就可以了。这不是问题的根源:
CREATE OR REPLACE FUNCTION table_update()
RETURNS trigger AS
$func$
BEGIN
NEW.last_edit := now();
RETURN NEW;
END
$func$ LANGUAGE plpgsql;
这个与接受的答案有关。
在进行brew更新时,我开始在MacOS Catalina 10.15.7上使用libdir出现问题,因为brew更新在两者之间失败,我注意到Postgresql是它尝试更新的众多软件包之一,上面的答案提供了关于多个安装的良好提示。
我确认我的系统上没有安装任何其他版本的 postgresql。因此,简单地重新启动服务为我提供了诀窍:brew services restart postgresql@10
我使用 FreeBSD 并找到了解决问题的简单方法, 只需从另一台服务器复制库并将其粘贴到/usr/local/lib/postgresql/中,这是$libdir的方式。尽管PostgreSQL的版本不同,但一切正常,我再次没有问题。