[PGSQL]PostgreSQL中的权限规划

很多PostgreSQL初学者分不清楚,PostgreSQL中的权限在总体上该如何分配管理,本文就解决这个问题。

PostgreSQL最大权限就是超级用户权限,这个超级用户可以在数据库中做任意的操作。当初使化数据库后,就会自动有超级用户,这个超级用户的名称与初使化数据库时的操作系统用户名相同。如果我们在操作系统用户pg001下执行initdb初使化PostgreSQL数据库的,则建出的数据库中有一个名称为pg001的超级用户。

使用这个初使的超级用户可以建其它的超级用户或普通用户。

PostgreSQL数据库中的一部分权限是在创建用户时指定的,另一部分权限是通过grant命令赋于的。在创建用户时可以指定的权限为:

  • 超级用户权限
  • 创建database的权限
  • 创建其他用户或角色的权限
  • 登录的权限

PostgreSQL中的权限是按照数据库逻辑对象的层次进行管理的,PostgreSQL逻辑对象的层次为:

  • database
  • schema:每个schema总是属于一个数据库的。数据库的属主就可以在他的数据库中创建各种schema。
  • 表、视图、函数等:这些对象都是属于一个schema的。用户如果有在schema上的CREATE权限,就可以在这个schema中创建表、视图、函数等数据库对象了。

注意:MySQL中的database概念实际上是PostgreSQL中的schema,而不是PostgreSQL中的database。

另需要注意的是,PostgreSQL中并没有单独的DDL权限,如没有这样的赋权语句:

GRANT create table to xxx;

所谓创建DDL语句的权限是在schema上的。如果一个用户是一个schema的属主或其有在schema中create的权限时,则他就能在这个schema中创建表、视图、函数等对象。所以如果要让一个用户A能够在另一个用户B的schema中创建表,则需要B用户使用下面的赋权语句给A用户赋权:

GRANT CREATE  ON SCHEMA schema_a TO A;

在权限的赋权过程中,PostgreSQL系统中有一个名称为“public”的虚拟用户,当把权限给这个用户后,就相当于任何用户都有这个权限。当我们想让数据库中所有用户时都能查询表mytab时,可以这样:

GRANT select on TABLE mytab to public; 

在刚初使化数据库完成后,数据库中默认就存在一个名称为“public”的schema,任何用户都有在这个schema上的create权限,因为这时任何用户都有创建表的权限,而通常我们需要把这个权限收回来:

REVOKE  CREATE  ON SCHEMA public from public;

DBA对于权限的规划,通常可以这样做,先建一个用户和建一个数据库,并指定此数据库的属主为这个用户:

CREATE USER myuser PASSWORD 'mypassword'; 
CREATE DATABASE mydb  OWNER  myuser ;

然后DBA把这个用户给应用软件的开发者。这时应用软件的开发者,就可以在这个数据库中根据需求创建schema,然后再在这个schema中创建表、视图、函数等对象了。