2014-12-05 51 views
0

我有以下角色一個PostgreSQL(9.3.5)集羣:(前兩個分別條目時動態創建新的用戶都被添加到應用程序)的PostgreSQL 9.3.5數字角色名

dochazka-test=> \du 
           List of roles 
Role name |     Attributes     | Member of 
-----------+------------------------------------------------+------------ 
1   |            | {admin} 
2   |            | {passerby} 
active | Cannot login         | {everyone} 
admin  | Cannot login         | {everyone} 
dochazka |            | {admin} 
everyone | Cannot login         | {} 
inactive | Cannot login         | {everyone} 
passerby | Cannot login         | {everyone} 
postgres | Superuser, Create role, Create DB, Replication | {} 

正如您所看到的,「dochazka」和「1」角色都屬於「admin」角色,屬於「everyone」角色。所有角色都設置爲INHERIT。

「everyone」角色對模式「public」中的所有表,函數和序列擁有所有權限。

正如所料,當我以用戶「dochazka」身份連接時,我可以在數據庫的表上運行SELECTs。

$ psql -U 1 dochazka-test 
Password for user 1: 
psql (9.3.5) 
Type "help" for help. 

dochazka-test=> select * from employees; 
ERROR: permission denied for relation employees 

難道是PostgreSQL有與數字角色名一個根本性的問題:然而,當我連接到相同的數據庫用戶「1」,我不能運行相同的SELECT?

回答

1

標識符和目錄使用name類型,它類似於varchar,但不完全。有些魔術繼續使名稱區分大小寫,除非它們被引用爲標識符,並且有一些限制條件可以更容易地解析SQL字符串,例如不引用時第一個字符的限制(例如不是數字)。

這並不是說您不能使用帶有大寫或以數字開頭的標識符。相反,你必須引用違規標識符,當你這樣做:select * from "0_Foo"

我的猜測是你要麼缺少雙引號,要麼你使用的客戶端沒有正確引用標識符。 (我剛剛測試過,並且它可以和psql一起使用)。

不管是哪個問題,儘管它支持紙張,但我建議不要使用這種標識符,並且會建議使用更多健談的角色名稱,例如作爲server_1

編輯:或者,您可能尚未正確配置您的權限。

+0

舉行新聞 - 我看到'dochazka'角色獲得相同的權限被拒絕的錯誤!對不起,也許這是一條紅鯡魚。 – smithfarm 2014-12-05 15:07:54

+0

還包括'select current_user;'的結果 - 您可能會以guest身份登錄。 – 2014-12-05 15:10:00

0

對不起,每個人。這個問題沒有做好充分的準備。

的問題是,我是(愚蠢)運行語句

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO everyone 

之前創建的表!

就數字角色名而言,psql和Perl DBI似乎都沒有任何問題。