2012-05-31 57 views
1

我有一個共同的用戶,mygs_user,跨越三個數據庫:mydatamodel,mygsNewdatabase(名稱更改爲保護無辜)。爲什麼需要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 

如何在不授予超級用戶權限的情況下向第三個數據庫的普通用戶授予訪問權限?

+1

由於'GRANT CONNECT,TEMPORARY ON DATABASE「NewDatabase」TO public',任何用戶都應該能夠連接到它。如果不是這樣,請提供錯誤消息。 –

+0

錯誤是「無法連接到這個關係,表名」。你是對的,訪問權限是在兩個原始數據庫的表級設置的。 – MAbraham1

回答

0

經進一步檢查,獲得權限設置爲授權的「MYGS」在對象級別在數據庫級角色,沒有明確的權限。問題是由下面的代碼解決,爲每個對象類型:

表:

ALTER TABLE tableNameHere OWNER TO postgres; 
GRANT ALL ON TABLE dtm_tableNameHereTO postgres; 
GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE tableNameHere TO "MYGS"; 

......功能:

ALTER FUNCTION functionNameHere(..) OWNER TO postgres; 
GRANT EXECUTE ON FUNCTION functionNameHere(..) TO postgres; 
GRANT EXECUTE ON FUNCTION functionNameHere(..) TO "MYGS"; 

......和順序:

ALTER TABLE sequenceNameHere OWNER TO postgres; 
GRANT ALL ON TABLE sequenceNameHere TO postgres; 
GRANT SELECT, UPDATE ON TABLE sequenceNameHere TO "MYGS"; 

雖然,Postgres的用戶是沒有必要的解決工作。

2

我想你忘了允許連接到這個數據庫的pg_hba.conf配置文件。

很可能需要添加有類似:

# TYPE DATABASE  USER   ADDRESS     METHOD 
local Newdatabase  MYGS         md5 
+0

Tometzky,偉大的思想!但是,我們已經在pg_hba: 主機中配置了開放訪問全部全部127.0.0.1/32 md5 – MAbraham1

+0

Tometzky,我用pg_hba.conf文件更新了我的問題。 – MAbraham1

相關問題