Postgresql

GRANT SELECT ON SEQUENCE 成功,但沒有效果?

  • January 22, 2019

我正在嘗試授予對從一個使用者/角色到另一個使用者/角色的序列的選擇訪問權限。我執行命令時沒有錯誤,但是一旦執行,第二個角色就無法查看序列。我在其他幾個成功的服務/數據庫實例上執行了完全相同的命令,這只是行為不端的一個。

我已經執行了兩個:

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;

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