Permissions
模式複制後功能被拒絕
我在名為“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 中出現的。