Permissions

模式複制後功能被拒絕

  • February 11, 2017

我在名為“isvalidoption”的模式中有一個“公共”模式和簡單函式。

做了什麼:

  • 使用 pg_dump 備份模式;
  • 將架構重命名為“開發”;
  • 創建新模式“公共”;
  • 使用 pg_restore 從備份中恢復它。

問題:

  • 當我從任何省略模式前綴的表中選擇時,例如“SELECT * FROM mytable;” 沒關係
  • 當我執行帶有“SELECT public.isvalidoption();”之類的架構前綴的函式時 或 ‘SELECT development.isvalidoption()’ 沒關係;
  • 當我執行省略模式前綴的函式時,例如 ‘SELECT isvalidoption();’ 我得到 ERROR: permission denied for function isvalidoption

使用者在兩種模式中都有 USAGE 和 EXECUTE 在兩種模式中的功能,他也是兩種模式中功能的所有者。

PostgreSQL 版本是 9.6.1。

‘選擇目前使用者;’ 顯示正確的使用者。

‘顯示搜尋路徑;’ 顯示 ‘"$user", public’。

有任何想法嗎?

經過數小時的文件閱讀後,我發現 PosgreSQL 甚至在 search_path 中列出的所有模式之前首先搜尋 pg_catalog 模式。

所以檢查了 pg_catalog 目錄,我不知道為什麼,但我的函式是在那裡定義的,使用者 postgres 是函式的所有者。

我剛剛從 pg_catalog 中刪除了我的函式,它可以正常工作並且按預期工作。

我仍然不知道該函式是如何在 pg_catalog 中出現的。

引用自:https://dba.stackexchange.com/questions/164005