2014-12-05 36 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似乎都没有任何问题。