无法访问文件“$libdir/plpgsql”:没有这样的文件或目录

问题描述 投票:0回答:3

我不知所措,我在本地 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

尝试过卸载并重新安装,但没有任何区别。有什么想法吗?

postgresql osx-lion plpgsql postgresql-9.3 postgres.app
3个回答
17
投票

您是否在同一个机器上安装了 Postgres 的多个实例(多个版本或同一版本的多个实例)?标准 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 赋值运算符

    :=
    =
    没有记录,但可以容忍。

    自 Postgres 9.4 起,
    :=
    =
    均已记录。

否则你的函数定义就没有问题。这不是问题的根源: CREATE OR REPLACE FUNCTION table_update() RETURNS trigger LANGUAGE plpgsql AS $func$ BEGIN NEW.last_edit := now(); RETURN NEW; END $func$;



3
投票
接受的答案

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

我确认我的系统上没有安装任何其他版本的 postgresql。因此,简单地重新启动服务对我来说就成功了:

brew services restart postgresql@10

    


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.