我很茫然,我在我的本地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
尝试过卸载并重新安装,但没有任何区别。有什么想法吗?
答案 0 :(得分:10)
你是否在同一个盒子上安装了多个实例(多个版本或同一版本的多个实例)的Postgres?标准Postgres不适合。 Debian或Ubuntu有额外的基础设施,可以并行使用多个版本。不过我不知道OS X.
在标准的Postgres中,path for $libdir
被编译到程序中。多个版本不相处。
执行pg_config --pkglibdir
时,请确保它与您的安装相关联。运行:
which pg_config
小调:
9.3.0
?建议始终升级到latest point-release,即9.3.2 atm。也许当前的来源可以解决您的问题。
同时检查您的设置是否使用了您认为正在使用的$libdir
SELECT * FROM pg_settings WHERE name ~~* '%lib%'
不要引用语言名称 。这是一个标识符:'plpgsql'
plpgsql
。
并使用plpgsql assignment operator :=。 =没有文件但是容忍atm。
<子> Since Postgres 9.4 both :=
and =
are documented. 子>
否则你的函数定义没问题。那是不问题的根源:
CREATE OR REPLACE FUNCTION table_update()
RETURNS TRIGGER AS
$func$
BEGIN
NEW.last_edit := now();
RETURN NEW;
END
$func$ LANGUAGE plpgsql;
答案 1 :(得分:1)
这个与accepted answer有关。
在进行 brew 更新时,我开始在 MacOS Catalina 10.15.7 上遇到 libdir 问题,因为 brew 更新在两者之间失败,我注意到 Postgresql 是它尝试更新的众多软件包之一,上面提供了答案关于多次安装的一个很好的提示。
我确认我的系统上没有安装任何其他版本的 postgresql。所以一个简单的服务重启对我有用:
brew services restart postgresql@10
答案 2 :(得分:0)
我使用FreeBSD并找到了解决问题的简单方法,只是从另一台服务器复制该库并将其粘贴到/ usr / local / lib / postgresql /中,这就是$ libdir的方法。尽管PostgreSQL的版本不同,但是一切正常,我再也没有问题。