设置权限级别
权限级别控制执行数据库管理器维护操作和管理数据库对象的能力。在 DB2 中共有 5 种权限:

图7
SYSADM
具有管理实例的完整特权,还可访问底层数据库中的数据。
SYSCTRL 和 SYSMAINT
拥有管理实例、其数据库和数据库对象的特定特权。这些权限不含 访问数据的权限。例如,像 'SELECT * FROM mytable' 或 'DELETE FROM mytable' 这样的语句是不允许的。
DBADM
拥有在特定数据库上执行管理任务的特权。还具有数据库的完整数据访问权限。
LOAD
拥有对指定数据库运行加载实用工具的特权。
下表总结了各权限可执行的功能。

图8
管理 DB2 权限
SYS* 权限是在数据库管理器配置中设置的,通过将操作系统或安全性设施中定义的用户组指派给关联的参数进行设置。它必须是最大长度为 8 个字符的组名称,如下所示。

图9
DBADM 和 LOAD 是数据库级的权限。使用 grant 语句可授予用户或用户组这些权限,使用 revoke 语句可予以撤销权限:
connect to sample; grant dbadm on database to user john; grant load on database to group dbagrp; revoke load on database from group dbagrp; |
请注意,具有 LOAD 权限的用户也需要表上的 INSERT 特权,之后才能加载数据。下一节将讨论特权。
设置特权
特权给予用户通过特定方式访问数据库对象的权力。如下列表给出了不同数据库对象的特权摘要。
数据库特权
CONNECT 允许用户连接数据库。
BINDADD 允许用户在数据库中创建新包。
CREATETAB 允许用户在数据库中创建新表。
CREATE_NOT_FENCED 允许用户创建非 fenced 用户定义的函数或存储过程。
IMPLICIT_SCHEMA 允许用户在尚不存在的模式中创建对象。 QUIESCE_CONNECT 允许用户在数据库停顿时访问数据库。
CREATE_EXTERNAL_ROUTINE 允许用户创建以 C 语言、Java™ 语言、OLD 和 COBOL 编写的存储过程。
模式特权
CREATEIN 允许用户在模式内创建对象。
ALTERIN 允许用户更改模式内的对象。
DROPIN 允许用户删除模式内的对象。
要显式地创建新模式,可使用 create schema 命令:
connect to sample user dbowner;create schema dev authorization devuser; |
空间特权
USE OF TABLESPACE 允许用户在特定表空间内创建表。这一特权无法用于 SYSCATSPACE 或任何系统临时表空间。
表与视图特权
CONTROL 为用户提供表或视图的所有特权,以及将这些特权(除 CONTROL 以外)授予他人的能力。
ALTER 允许用户更改表或视图。
DELETE 允许用户删除表或视图中的记录。
INDEX 允许用户在表上创建索引。
INSERT 允许用户向表或视图中插入条目。
REFERENCES 允许用户创建和删除外键,将表指定为关系中的父表。
SELECT 允许用户从表或视图中检索行。
UPDATE 允许用户在表或视图中更新条目。这一特权还可将用户约束为仅更新特定列: grant update (workdept, job) on table employee to devuser;
ALL PRIVILEGES 授予用户表或视图上的上述全部特权(除 CONTROL 外)。
包特权
CONTROL 为用户提供了重新绑定、删除或执行一个包的能力,以及将这些特权(除CONTROL以外)授予他人的能力。
BIND 允许用户重新绑定现有包。
EXECUTE 允许用户执行包。
索引特权
CONTROL 允许用户删除索引。
例程特权
EXECUTE 允许用户执行用户定义的函数。
顺序特权
USAGE 允许用户为顺序对象使用 NEXTVAL 和 PREVVAL 表达式。
授予显式特权
授予特权 with grant option 允许授权 ID 将特定特权扩展给他人。该选项仅对包、例程、模式、表、表空间和视图可用。
尽管特权的授予是可扩展的,但撤销特权并非如此。若通过 with grant option 获得了特权,用户不能撤销他人的特权。示例如下。
该语句允许 john 在表 employee 上执行 select、update 或 delete 操作,并可将这些特权授予他人:
该语句允许 devusers 组中的用户重新绑定、删除及执行包 dev.pkg1。同一组的用户还可将 BIND 和 EXECUTE(但不包括 CONTROL)特权授予他人。
授予隐式及间接特权
典型情况下,DB2 特权是通过 grant 语句显式授予的,方法如前所述。有时用户可能还要隐式或间接地通过执行的特定操作获得特权。让我们来看一些场景。
被授予 DBADM 权限的用户还被隐式地授予 BINDADD、CONNECT、CREATETAB、CREATE_NOT_FENCED 和 IMPLICIT_SCHEMA 权限。
当用户创建数据库时:
◆DBADM 权限将被授予数据库创建者。
◆CONNECT、CREATETAB、BINDADD 和 IMPLICIT_SCHEMA 特权将被授予 PUBLIC。
◆USERSPACE1 表空间上的 USE OF TABLESPACE 特权将被授予 PUBLIC。
◆各成功绑定实用工具上的 BIND 和 EXECUTE 特权将被授予 PUBLIC。
grant select, update, delete on table employee to user johnwith grant option |
◆SYSFUN 模式中所有函数的 EXECUTE 特权 with grant option 将被授予 PUBLIC。
grant control on package dev.pkg1 to group devuserswith grant option |
创建表、视图、索引、模式或包的用户将自动获得他/她所创建的数据库对象上的 CONTROL 特权。
当用户执行一个包含静态 SQL 语句的包时,语句中所引用的数据库对象的显式特权是不需要的。用户仅需要包上的 EXECUTE 特权来执行语句。但这并不表示该用户有权直接访问底层数据库对象。考虑以下示例:

- IBM DB2 rec2xml远程缓冲区溢出漏洞
- IBM DB2共享库注入漏洞