2017-03-02 59 views
0

我已經嘗試過幾乎所有可以獲得postgres中某些關係的用戶權限。以下是我已經試過:無論如何都無法獲得關係的權限

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO myuser; 
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO myuser; 
ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO myuser; 
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO myuser; 

我已經改變了我pg_hba.cnf這樣:

# TYPE DATABASE  USER   ADDRESS     METHOD 

# "local" is for Unix domain socket connections only 
local all    all          trust 
# IPv4 local connections: 
host all    all    127.0.0.1/32   trust 
# IPv6 local connections: 
host all    all    ::1/128     trust 
# Allow replication connections from localhost, by a user with the 
# replication privilege. 
#local replication  postgres        peer 
#host replication  postgres  127.0.0.1/32   ident 
#host replication  postgres  ::1/128     ident 

我敢肯定,如果你擺弄他們的權利,這些命令做一些事情,但爲什麼這些命令中沒有任何一個能夠在接近他們所說的地方做任何事情?

我使用python:

>>> conn = psycopg2.connect(host="localhost", port="5432", dbname="mydb",user="myuser", password="mypassword") 
>>> cur = conn.cursor() 
>>> cur.execute('select count(*) from mytable') 

這是我得到的錯誤:

>>> cur.execute('select count(*) from public.mytable') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
psycopg2.ProgrammingError: permission denied for relation mytable 

我也試過:

ALTER DATABASE mydb OWNER TO myuser; 

並反覆重啓,當然。

+0

在得到錯誤之前執行了什麼命令? –

+0

模式爲「公共」的表?你可以在用'psql'連接時以'myuser'的身份訪問它嗎? –

+0

說明顯而易見:在schema中是mytable嗎?或者它可能位於search_path的不同模式中? –

回答

0

您是否在mydb分配了所有者myuser? 這是解決你的問題一個簡單的方法:

CREATE DATABASE mydb OWNER myuser;

+0

這不是必需的 –

0

所以每this的答案,我可以通過單獨給予它一個表,我想以訪問我必須做的每個表。

仍然不知道爲什麼這工作。

GRANT ALL PRIVILEGES ON TABLE mytable TO myuser; 

而這些都沒有。

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO myuser; 
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO myuser; 
ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO myuser; 
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO myuser; 
+0

第一個聲明會給你必要的權限。我懷疑你在創建表之前發佈了這些語句*。那麼第一條語句不會有任何影響,因爲它隻影響已經存在的表。但是第三個語句應該考慮將來創建的表 - 除非發佈它的用戶與運行CREATE TABLE的用戶是不同的用戶(在這種情況下,您需要使用'FOR USER someuser '與運行'CREATE TABLE'的用戶)。這是我能想出的唯一解釋。 –

+0

什麼版本的postgreSQL是你的服務器? – moooeeeep