当 START VIOLATIONS TABLE 语句创建诊断表时,在目标表上授予的访问权限集是在诊断表上授予权限的基础。然而,当数据库服务器授予每一类权限时,它遵循下列规则:
下表说明数据库服务器在诊断表上授予每一权限所处的环境。
- 权限
- 授予权限的条件
- Insert
- 如果用户在目标表的任何列上有 Insert、Delete 或 Update 权限,则用户有在诊断表上的 Insert 权限。
- Delete
- 如果用户在目标表的任何列上有 Insert、Delete 或 Update 权限,则用户在诊断表上有 Delete 权限。
- Select
- 如果用户在目标表的任何列上有 Select 权限,则用户在诊断表上有 Select 权限。
- Update
- 如果用户在目标表中的任何列上有 Update 权限,则用户在诊断表上有 Update 权限。
- Index
- 如果用户在目标表上有 Index 权限,则用户在诊断表上有 Index 权限。
- Alter
- 不在诊断表上授予 Alter 权限。
(用户不可更改诊断表的模式。)
- References
- 不在诊断表上授予 References 权限。
(用户不可在诊断表上定义引用的约束。)
下列规则涉及在诊断表上的访问权限:
- 当创建诊断表时,目标表的所有者成为诊断表的所有者。
- 诊断表的所有者自动地收到诊断表上的所有表级权限,包括 Alter 和 References 权限。然而,数据库服务器防止诊断表的所有者更改诊断表或給诊断表添加引用的约束。
- 您可使用 GRANT 和 REVOKE 语句来修改在诊断表上的初始权限集。
- 对于在其上定义有过滤器模式唯一索引或约束的目标表上的 INSERT、DELETE 或 UPDATE 操作,您必须在违反表和诊断表上有 Insert 权限。
如果您在违反表和诊断表上没有 Insert 权限,则数据库服务器在目标表上执行 INSERT、DELETE 或 UPDATE
语句,假如您在目标表上有必要的权限的话。数据库服务器不返回有关在违反表和诊断表上缺少 Insert 权限的错误,除非在执行 INSERT、DELETE 或 UPDATE
语句期间检测到完整性违反。
类似地,当您发出 SET Database Object Mode
语句来将禁用的约束或禁用的唯一索引设置为启用的或过滤器模式,且对于目标表存在违反表和诊断表时,您必须在违反表和诊断表上有 Insert 权限。
如果您在违反表和诊断表上没有 Insert 权限,则数据库服务器执行 SET Database Object Mode
语句,假如您在目标表上有必要的权限的话。数据库服务器不返回有关在违反表和诊断表上缺少 Insert 权限的错误,除非在执行 SET Database Object
Mode
语句期间检测到完整性违反。
- 在诊断表上的权限的初始集的授予者与在目标表上的权限的授予者相同。例如,如果通过用户 wayne 和用户 laurie 在目标表上授予了 用户 jenny Insert 权限,则用户 wayne 和用户 laurie 都将在诊断表上的 Insert 权限授予用户 jenny。
- 一旦为目标表启动诊断表,从一用户取消在目标表上的权限不会自动地从该用户取消在诊断表上的同一权限。您反而必须显式地在诊断表上从该用户取消该权限。
- 如果您在目标表上有分片级权限,则您在诊断表上有相应的表级权限。
下一示例展示如何从目标表上的当前权限推导出诊断表上的权限的初始集。
假设您有持有
customer 数据的名为
cust_subset 的表。此表由下列列组成:
ssn (社保编号)、
fname(名)、
lname(姓)和
city(客户生活的城市)。在
cust_subset 表上存在下列访问权限集:
- 用户 alvin 是表的所有者。
- 用户 barbara 有对表的 Insert 和 Index 权限。她还有在 ssn 和 lname 列上的 Select 权限。
- 用户 danny 有表上的 Alter 权限。
- 用户 carrie 在 city 列上有 Update 权限。她还在 ssn 列上有 Select 权限。
现在,用户
alvin 为
cust_subset 表启动名为
cust_subset_viols 的违反表和名为
cust_subset_diags 的诊断表:
START VIOLATIONS TABLE FOR cust_subset
USING cust_subset_viols, cust_subset_diags;
数据库服务器在
cust_subset_diags 诊断表上授予下列初始的权限集:
- 用户 alvin 是诊断表的所有者,因此他有表上的所有表级权限。
- 用户 barbara 在诊断表上有 Insert、Delete、Select 和 Index 权限。
- 用户 carrie 在诊断表上有 Insert、Delete、Select 和 Update 权限。
- 用户 danny 在诊断表上没有权限。