我在名为“isvalidoption”的模式中有一个“公共”模式和简单函数。
做了什么:
- 使用 pg_dump 备份模式;
- 将架构重命名为“开发”;
- 创建新模式“公共”;
- 使用 pg_restore 从备份恢复它。
问题:
- 当我从任何省略模式前缀的表中进行选择时,例如“SELECT * FROM mytable;” 没关系
- 当我运行带有像“SELECT public.isvalidoption();”这样的模式前缀的函数时 或者 'SELECT development.isvalidoption()' 就可以了;
- 当我运行省略架构前缀的函数时,如“SELECT isvalidoption();” 我收到错误:函数 isvalidoption 的权限被拒绝
用户在两个模式上都有 USAGE,在两个模式中都有 EXECUTE 函数,他也是两个模式中函数的所有者。
PostgreSQL 版本为 9.6.1。
'选择当前用户;' 显示正确的用户。
'显示搜索路径;' 显示 '"$user", public'。
有任何想法吗?
在阅读了数小时的文档之后,我发现 PosgreSQL 甚至在 search_path 中列出的所有模式之前首先搜索 pg_catalog 模式。
所以检查了 pg_catalog 目录,我不知道为什么但是我的函数在那里定义并且用户 postgres 是该函数的所有者。
我刚刚从 pg_catalog 中删除了我的函数,它没问题,并且按预期完美运行。
我仍然不知道该函数是如何到达 pg_catalog 中的。