Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1299122
  • 博文数量: 436
  • 博客积分: 7854
  • 博客等级: 少将
  • 技术积分: 3225
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-18 16:30
文章分类

全部博文(436)

文章存档

2013年(2)

2012年(56)

2011年(70)

2010年(308)

分类:

2011-01-26 14:39:06

  Chapter 6. 用户和权限

Table of Contents
6.1. 数据库用户
6.2. 用户属性
6.3. 组
6.4. 权限
6.5. 函数和触发器

每个数据库都包含一个数据库用户的集合。 这些用户是和那些在同一个服务器上运行的的用户相独立的。 用户拥有数据库对象(比如说,表)以及可以把这些对象的权限赋予 其它用户,这样就能控制谁可以访问哪些对象。

本章描述如何创建和管理用户,以及介绍权限系统。 有关各种类型的数据库对象和权限的效果可以在 PostgreSQL 7.3 用户手册 中找到。
6.1. 数据库用户

数据库用户从概念上与操作系统用户是完全无关的. 在实际使用中把它们对应起来可能比较方便,但不是必须的. 数据库用户名在整个数据库集群中是全局的(而不是每个库不同). 要创建一个用户,使用 SQL 命令 CREATE USER:

CREATE USER name

name 遵循 SQL 标识的规则: 要么完全没有特殊字符,要么用双引号引起. 要删除一个现有用户,使用类似的命令 DROP USER:

DROP USER name

为了方便,shell 脚本createuser和 dropuser 提供了对了这些 SQL 命令的封装. 我们可以在 shell 命令上直接调用它们:

createuser name
dropuser name

为了能初创数据库系统,新建立的数据库总是包含一个预定义的用户. 这个用户将有固定的 ID 1,并且缺省时(除非在运行 initdb 时更改过)他将和 初始化该数据库集群的用户有相同的名称。 通常,这个用户叫postgres. 为了创建更多用户,你必须首先以这个初始用户身份联接.

一个和数据库的活跃连接只能有一个用户身份进行。 和特定数据库联接的用户名是由初始化联接请求的应用以应用相关的方式声明的, 比如,psql 程序使用-U命令行选项声明它代表的进行联接 的用户.许多应用以当前操作系统的用户名为缺省(这样的应用包括 createuser 和 psql)。 这样我们就可以很方便地维护这两个用户集合之间地映射关系。

一个客户端联接可以用来联接的数据库用户集合是由客户 认证设置决定的,在 Chapter 4 里面有解释.(因此,一个客户端并不局限于以它的操作系统用户 同名的用户进行联接,就象你登录系统的名称不一定要是你的真实 名称一样.)因为用户地身份决定了一个已连接地客户端可用的权限, 所以在多用户环境里仔细配置这些内容是非常重要的。

6.2. 用户属性

一个数据库用户可以有一系列属性,这些属性定义他的权限,以及与 客户认证系统的交互.

superuser(超级用户)

数据库超级用户超越所有权限检查.同样,只有超级用户才能 创建新的用户.要超级用户,用 CREATE USER name CREATEUSER.
database creation(创建数据库)

用户要想创建数据库,必须明确给出权限(对于超级用户是例外,因为 他们超越所有权限检查).要创建这样的用户,用 CREATE USER name CREATEDB.
password(口令)

只有在对客户认证方法要求客户在与数据库建立连接是使用口令的时候,口令才比较重要. password,md5,和 crypt 认证方法使用口令。 数据库口令与操作系统口令是无关的.在创建用户的时候 声明一个口令是这样: CREATE USER name PASSWORD 'string'.

一个用户的属性可以在创建后用 ALTER USER 修改. 参考 CREATE USER 和 ALTER USER 的手册获取细节.

一个用户也可以为许多运行时配置设置个人缺省, 那些配置在 Section 3.4 里描述。 比如,如果出于某种原因你想在所有你做的连接中关闭索引扫描(提示:不是个好主意), 你可以用

ALTER USER myname SET enable_indexscan TO off;

这样就会保存该设置(但是不是立即设置)并且在随后的连接中就好像 在会话开始之后都马上 SET enable_indexscan TO off;了一样。 你也可以在会话中修改这个设置;它只是缺省。要撤销任何这样的设置, 使用 ALTER USER username RESET varname;。

6.3. 组

和 Unix 里一样,组是一个逻辑上对用户分组,进而简化权限管理的方法∶ 权限可以赋予整个组,也可以对整个组撤除. 要创建一个组,使用

CREATE GROUP name

要向组中增加用户或删除用户,用

ALTER GROUP name ADD USER uname1, ...
ALTER GROUP name DROP USER uname1, ...

6.4. 权限

当创建一个数据库对象时,它属于一个用户.该用户就是执行创建 命令的那位.要改变一个表,索引,序列,或者视图的所有者,使用 ALTER TABLE 命令。 缺省时,只有所有者(或者超级用户)可以对该对象做任何事情.为了 让别的用户也能用它,必须赋予那些用户权限.

我们有以下几种权限:SELECT(读), INSERT(追加), UPDATE(写),DELETE, RULE(规则),REFERENCES(外键), TRIGGER, CREATE,TEMPORARY,EXECUTE, USAGE,和 ALL PRIVILEGES。 有关PostgreSQL所支持的权限的更多信息,请 参阅 PostgreSQL 7.3 参考手册 里面的 GRANT 页获取更多详细的信息. 修改或者删除一个对象的权限总是只有该对象的所有者才有. 要赋予权限,必需使用 GRANT 命令. 要赋权限,用GRANT命令.因此,如果 joe 是一个现存用户,而 accounts是一个现存表,那么可以这样赋予更新权限

GRANT UPDATE ON accounts TO joe;

执行这条命令的用户必须是表的所有者.要给一个组赋权限,用

GRANT SELECT ON accounts TO GROUP staff;

特殊的"用户"名 PUBLIC可以用于 给系统中的每一个用户赋权限.写 ALL 在 权限声明位置上表明赋予所有权限.

要废除一个权限,用 REVOKE 命令:

REVOKE ALL ON accounts FROM PUBLIC;

表所有者的特殊权限(也就是说,做 DROP,GRANT, REVOKE 等等的权限)总是隐含给所有者的,并且不能赋予或者删除. 但是表所有者可以废除他的普通权限,比如给自己做一个只读的表,就象给 别人做一样.
阅读(1074) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~