12

我很茫然,我在本地 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

DLSUFFIX 设置正确:

lib/pgxs/src/Makefile.shlib:135:    DLSUFFIX        = .so

已经尝试卸载和重新安装,但没有任何区别。有任何想法吗?

4

3 回答 3

14

您是否在同一个机器上安装了 Postgres 的多个实例(多个版本或同一版本的多个实例)?标准 Postgres 不适合这种情况。Debian 或 Ubuntu 有额外的基础设施来允许并行的多个版本。不过,我不知道 OS X。

在标准 Postgres 中,路径$libdir被编译到程序中。多个版本相处不来。
当您执行时pg_config --pkglibdir,请确保它与您的安装相关联。跑:

which pg_config

小提示:

否则你的函数定义很好。这不是问题的根源:

CREATE OR REPLACE FUNCTION table_update()
  RETURNS trigger AS
$func$
BEGIN
   NEW.last_edit := now();
   RETURN NEW;
END
$func$  LANGUAGE plpgsql;
于 2013-12-30T19:57:56.930 回答
1

这与接受的答案有关。

我在进行 brew 更新时开始在 MacOS Catalina 10.15.7 上遇到 libdir 的问题,因为 brew 更新在两者之间失败,我注意到 Postgresql 是它试图更新的众多软件包之一,上面的答案提供了一个很好的提示关于多个安装。

我确认我的系统上没有安装任何其他版本的 postgresql。所以一个简单的服务重启对我有用: brew services restart postgresql@10

于 2021-07-28T08:34:13.573 回答
0

我用的是FreeBSD,找到了一个简单的方法来解决这个问题,只是从另一台服务器复制了这个库并粘贴到/usr/local/lib/postgresql/,就是$libdir的方式。尽管 PostgreSQL 的版本不同,但一切正常,我再次没有问题。

于 2018-10-23T17:41:03.873 回答