Postgresql
GRANT SELECT ON SEQUENCE 成功,但沒有效果?
我正在嘗試授予對從一個使用者/角色到另一個使用者/角色的序列的選擇訪問權限。我執行命令時沒有錯誤,但是一旦執行,第二個角色就無法查看序列。我在其他幾個成功的服務/數據庫實例上執行了完全相同的命令,這只是行為不端的一個。
我已經執行了兩個:
GRANT SELECT ON ALL SEQUENCES IN SCHEMA schema_name TO new_role;
根據這裡的建議:
正如我上面提到的,這在不同機器上的其他數據庫模式上是成功的。我也單獨嘗試過:
GRANT SELECT ON SEQUENCE some_id_sequence TO new_role;
和
GRANT SELECT ON SEQUENCE public.some_id_sequence TO new_role;
這也沒有效果。從我登錄時,
new_role
我看到:select * from information_schema.role_usage_grants ; ... (0 rows)
執行時類似的結果(或缺乏)
\ds
。我可以從之前的角色中看到,該序列應該是“可授予的”(無論如何,我找不到任何關於它的文件)
live@live ~ => select * from information_schema.role_usage_grants limit 1; ┌──────────┬──────────┬────────────────┬───────────────┬──────────────┬─────────────┬────────────────┬──────────────┐ │ grantor │ grantee │ object_catalog │ object_schema │ object_name │ object_type │ privilege_type │ is_grantable │ ├──────────┼──────────┼────────────────┼───────────────┼──────────────┼─────────────┼────────────────┼──────────────┤ │ old_role │ old_role │ old_role │ public │ some_id_seq │ SEQUENCE │ USAGE │ YES │ └──────────┴──────────┴────────────────┴───────────────┴──────────────┴─────────────┴────────────────┴──────────────┘ (1 row)
所以我真的不知道在哪裡看這一點。舊角色似乎能夠將選擇授予其他角色,並且在嘗試執行命令時不會出錯,但是新角色仍然沒有訪問權限。
結果
\dn+
\dn+ List of schemas ┌───────────┬──────────┬────────────────────────┬─────────────┐ │ Name │ Owner │ Access privileges │ Description │ ├───────────┼──────────┼────────────────────────┼─────────────┤ │ new_role │ old_role │ old_role=UC/old_role ↵│ │ │ │ │ new_role=U/old_role │ │ │ public │ old_role │ │ │ └───────────┴──────────┴────────────────────────┴─────────────┘ (2 rows) \du+ new_role List of roles ┌───────────┬────────────┬───────────┬─────────────┐ │ Role name │ Attributes │ Member of │ Description │ ├───────────┼────────────┼───────────┼─────────────┤ │ new_role │ │ {} │ │ └───────────┴────────────┴───────────┴─────────────┘
結果來自
\dp
\dp some_id_sequence Access privileges ┌────────┬──────────────────┬──────────┬───────────────────────┬───────────────────┬──────────┐ │ Schema │ Name │ Type │ Access privileges │ Column privileges │ Policies │ ├────────┼──────────────────┼──────────┼───────────────────────┼───────────────────┼──────────┤ │ public │ some_id_sequence │ sequence │ old_role=rwU/old_role │ │ │ │ │ │ │ new_role=r/old_role │ │ │ └────────┴──────────────────┴──────────┴───────────────────────┴───────────────────┴──────────┘
問題:如何確定阻止應用序列授權的原因?
如果序列包含在使用者無權訪問的模式中,則對序列授予 SELECT(或 USAGE)是不夠的。我相信是這種情況,因為您命名的架構
public
不是公開的。如果是,它將具有如下所示的權限:test=> \dn+ List of schemas Name | Owner | Access privileges | Description --------+----------+----------------------+------------------------ public | postgres | postgres=UC/postgres+| standard public schema | | =UC/postgres |
與問題中顯示的缺乏訪問權限相反。這也與相同的命令在您的其他實例中工作的事實一致:可能這些其他數據庫的公共架構是原始的,而不是刪除/重新創建的不同版本或刪除了它的權限。
作為可能的解決方案,請考慮作為架構的所有者執行以下操作:
GRANT ALL ON SCHEMA public TO public;
或更有限的
GRANT ALL ON SCHEMA public TO new_role;
或者更有限
GRANT USAGE ON SCHEMA public TO new_role;