我有一個共同的用戶,mygs_user
,跨越三個數據庫:mydatamodel
,mygs
和Newdatabase
(名稱更改爲保護無辜)。爲什麼需要Postgres超級用戶才能訪問我的數據庫?
我已經'繼承'了前兩個數據庫,並創建了第三個(Newdatabase
),它的安全性必須緊密複製原來的兩個數據庫 - 包括使用相同的用戶名和角色。
問題是當兩個原始數據庫沒有顯式權限時,普通用戶mygs_user
可以很好地訪問它們。第三個(Newdatabase
)不允許訪問,除非我將普通用戶修改爲超級用戶,這顯然不是最佳做法。
當然,我已經嘗試將我的NewDB的安全設置設置爲沒有骰子的原始設置。
這裏是原來的兩個數據庫:
mydatamodel
CREATE DATABASE mydatamodel
WITH OWNER = postgres
ENCODING = 'UTF8'
TABLESPACE = datamodel_tablespace
LC_COLLATE = 'English, United States'
LC_CTYPE = 'English, United States'
CONNECTION LIMIT = -1;
mygs
CREATE DATABASE mygs
WITH OWNER = postgres
ENCODING = 'UTF8'
TABLESPACE = mygs_tablespace
LC_COLLATE = 'English, United States'
LC_CTYPE = 'English, United States'
CONNECTION LIMIT = -1;
...這裏是新的數據庫:
CREATE DATABASE "NewDatabase"
WITH OWNER = postgres
ENCODING = 'UTF8'
TABLESPACE = pg_default
LC_COLLATE = 'English, United States'
LC_CTYPE = 'English, United States'
CONNECTION LIMIT = -1;
GRANT CONNECT, TEMPORARY ON DATABASE "NewDatabase" TO public;
GRANT ALL ON DATABASE "NewDatabase" TO postgres;
GRANT ALL ON DATABASE "NewDatabase" TO mygs_user;
兩個原始佔據單獨的表空間,而新的不:
CREATE TABLESPACE mygs_tablespace
OWNER postgres
LOCATION 'c:/MYGS_Database/PostgreSQL';
CREATE TABLESPACE datamodel_tablespace
OWNER postgres
LOCATION 'c:/MYGS_Database/MyDataModel';
這是該commmon用戶:
CREATE ROLE mygs_user LOGIN
SUPERUSER NOINHERIT NOCREATEDB NOCREATEROLE;
GRANT "MYGS" TO mygs_user;
...和的共同作用:
CREATE ROLE "MYGS"
NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;
以下是pg_hba.conf文件內容:
# TYPE DATABASE USER CIDR-ADDRESS METHOD
# IPv4 local connections:
host all all 127.0.0.1/32 md5
如何在不授予超級用戶權限的情況下向第三個數據庫的普通用戶授予訪問權限?
由於'GRANT CONNECT,TEMPORARY ON DATABASE「NewDatabase」TO public',任何用戶都應該能夠連接到它。如果不是這樣,請提供錯誤消息。 –
錯誤是「無法連接到這個關係,表名」。你是對的,訪問權限是在兩個原始數據庫的表級設置的。 – MAbraham1