当您发出 START VIOLATIONS TABLE 语句来创建违反表时,数据库服务器使用在目标表上授予的权限集作为对违反表授予权限的基础。然而,当数据库服务器授予每一权限类别时,它遵循不同的规则。
下表汇总数据库服务器在其下对违反表授予的每一类权限的环境。
- 权限
- 授予该权限的条件
- Alter
- 未在违反表上授予 Alter 权限。(用户不可更改违反表。)
- Index
- 如果用户在目标表上有 Index 权限,则用户在违反表上有 Index 权限。
- Insert
- 如果用户在目标表的任何列上有 Insert、Delete 或 Update 权限,则用户在违反表上有 Insert 权限。
- Delete
- 如果用户在目标表的任何列上有 Insert、Delete 或 Update 权限,则用户在违反表上有 Delete 权限。
- Select
- 如果用户在目标表的任何列上有 Select 权限,则用户在违反表的 gbasedbt_tupleid、gbasedbt_optype 和
gbasedbt_recowner 列上有 Select 权限。
如果用户在目标表中同一列上有 Select 权限,则用户在违反表的任何其他列上有
Select 权限。
- Update
- 如果用户在目标表的任何列上有 Update 权限,则用户在违反表的 gbasedbt_tupleid、gbasedbt_optype 和
gbasedbt_recowner 列上有 Update 权限。
(然而,即使在 gbasedbt_tupleid 列上带有 Update
权限,用户也不可更新此 SERIAL 列。)
如果用户在目标表中的同一列上有 Update 权限,则用户在任何其他的违反表列上有 Update 权限。
- 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
语句期间检测到完整性违反。
- 在违反表上的权限的初始集的授予者与在目标表上的权限的授予者相同。
例如,如果用户 jill 和用户 albert 授予了用户 henry 在目标表上的 Insert 权限,则 jill 和 albert 将违反表上的 Insert 权限授予 henry。
- 在启动违反表之后,从一用户撤销目标表上的权限不会自动地从那个用户撤销在违反表上的同一权限。您反而必须显式地从该用户撤销在违反表上的该权限。
- 如果您在目标表上有分片级权限,则您在违反表上有对应的分片级权限。