GRANT ALL ON ALL TABLES IN SCHEMA 不允許使用者查看表
我有一個非常簡單的腳本來創建一個新數據庫並創建一個新使用者來訪問這個數據庫。這是由預設的 postgres 使用者執行的。在授予使用者對數據庫和模式的訪問權限後,新創建的使用者仍然無法看到
\dt
在 psql 中使用的表。以下是腳本的一些片段,以顯示我到目前為止所嘗試的內容:CREATE USER api WITH ENCRYPTED PASSWORD 'password'; ALTER DEFAULT PRIVILEGES FOR USER api IN SCHEMA public GRANT ALL ON ALL TABLES TO api; DROP DATABASE IF EXISTS new_db; CREATE DATABASE new_db; CREATE TABLE addresses ( address_id INTEGER, address_line_1 VARCHAR(50) NOT NULL, address_line_2 VARCHAR(50), city VARCHAR(50) NOT NULL, state VARCHAR(2) NOT NULL, zipcode VARCHAR(12) NOT NULL, PRIMARY KEY (address_id) ); -- Create more tables.... -- Added these in for good measure at the end: GRANT all PRIVILEGES on DATABASE new_db to api; GRANT ALL ON DATABASE new_db TO api; GRANT ALL ON SCHEMA public to api; GRANT ALL ON ALL TABLES IN SCHEMA public TO api;
執行後,
\dt
以 postgres 使用者身份登錄時顯示 psql 中的所有表。 以 api 使用者身份登錄時\dt
顯示。Did not find any relations.
與 postgres 使用者一起執行
\dn+
會為我提供以下資訊:Name | Owner | Access privileges | Description --------+----------+-----------------------+------------------------ public | postgres | postgres=UC/postgres +| standard public schema | | =UC/postgres +| | | api=UC/postgres |
版本資訊:
PostgreSQL 10.5 (Ubuntu 10.5-2.pgdg16.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609, 64-bit
到目前為止我遇到的其他 SO 問題:
- 授予使用者對所有表的訪問權限
- https://stackoverflow.com/questions/7866572/why-can-i-only-see-postgresql-relations-or-tables-when-im-logged-in-as-the-post
- https://stackoverflow.com/questions/7758533/postgresql-database-owner-cant-access-database-no-relations-found
- https://stackoverflow.com/questions/37543078/cant-see-tables-in-postgresql
我查看了無數 SO 問題並嘗試了所有建議,但仍然沒有運氣。還有什麼我可以檢查或嘗試的嗎?我的預感是我遺漏了一些明顯的東西。
創建一個組,這意味著一個
ROLE
withNOLOGIN
。CREATE ROLE api_group NOLOGIN;
創建(或根據需要先刪除)您的數據庫。然後連接到該數據庫。
CREATE DATABASE new_db; \c new_db
為您的組添加預設權限。下面的程式碼說明了角色是否為
postgres
角色創建了對象授權。您可以更具體而不是 ALL(例如 SELECT、INSERT、USAGE 等)。ALL``api_group
ALTER DEFAULT PRIVILEGES FOR ROLE postgres ALL ON TABLES TO api_group ; ALTER DEFAULT PRIVILEGES FOR ROLE postgres ALL ON SEQUENCES TO api_group ; ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT ALL ON FUNCTIONS TO api_group ; ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT ALL ON TYPES TO api_group ; ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT ALL ON SCHEMAS TO api_group ;
現在您可以使用
postgres
user 來創建新對象。CREATE TABLE addresses ( address_id INTEGER, address_line_1 VARCHAR(50) NOT NULL, address_line_2 VARCHAR(50), city VARCHAR(50) NOT NULL, state VARCHAR(2) NOT NULL, zipcode VARCHAR(12) NOT NULL, PRIMARY KEY (address_id) ); -- Create more objects....
設置已準備就緒。
api
如果即使在創建所有對象之後添加新使用者(比如說) ,該使用者也將擁有所有權限。那裡的INHERIT
關鍵字用於繼承它所屬的角色的權限。下面的程式碼創建 2 個使用者作為api_group
.CREATE ROLE api INHERIT WITH ENCRYPTED PASSWORD 'pwd' IN ROLE api_group; CREATE ROLE another_api INHERIT WITH ENCRYPTED PASSWORD 'pwd' IN ROLE api_group;
建議的文件部分;