我在 PostgreSQL 9.5 上安装了 orafce 扩展。我看到最好为所有扩展创建一个特定的模式,而这正是我所做的。我连接到模板 1 并执行了以下命令:
template1=# create schema extensions;
CREATE SCHEMA
template1=# grant usage on schema extensions to public;
GRANT
template1=# grant execute on all functions in schema extensions to public;
GRANT
template1=# alter default privileges in schema extensions grant execute on
functions to public;
ALTER DEFAULT PRIVILEGES
template1=# alter default privileges in schema extensions grant usage on
types to public;
ALTER DEFAULT PRIVILEGES
template1=# create extension orafce schema extensions;
CREATE EXTENSION
template1=# show search_path;
search_path
-----------------
"$user", public
(1 row)
template1=# set search_path="$user",public,extensions;
SET
之后,我创建了一个新数据库 test1 和一个新用户 mariel1。此外,我编辑了 postgresql.conf 并将 search_path 设置为“$user”、public、extensions。
我连接到数据库 - psql -d test1 -U mariel1
. 现在,当我尝试使用函数 sysdate 时,例如数据库无法识别该函数:
postgres=# select sysdate() from dual;
ERROR: function sysdate() does not exist
LINE 1: select sysdate() from dual;
^
HINT: No function matches the given name and argument types. You might need
to add explicit type casts.
postgres=# select extensions.sysdate() from dual;
ERROR: schema "extensions" does not exist
LINE 1: select extensions.sysdate() from dual;
经过一番搜索,我看到了一些在其他模式下可用的功能,如 oracle、utl_file 等。我想了解为什么 orafce(oracle.sysdate 等)的功能是在不同的模式(oracle、utl_file..)下创建的,而不是在我的新模式扩展下创建的。