REVOKE 语句
REVOKE语句用于撤销授权ID的权限。
以下特权类别分别对应不同的声明表格:
可用的对象始终在当前服务器上。
调用 REVOKE
此语句可嵌入应用程序中或者以交互方式发出。 这是一个可执行语句,只有在DYNAMICRULES RUN行为生效时才能动态准备。 更多信息,请参阅授权ID和动态SQL。
如果在安装 Db2 子系统时未激活授权机制,则会出现错误。
授权 REVOKE
如果未指定 BY 子句,则语句的授权 ID 必须至少授予 FROM 子句中指定的每个授权名称 (包括指定的 PUBLIC)一个指定的权限。 如果指定了 BY 条款,则语句的授权 ID 必须具有 SECADM 或 ACCESSCTRL 权限
- 系统 DBADM
- ACCESSCTRL
- DATAACCESS
- CREATE_SECURE_OBJECT权限
要撤销CREATE_SECURE_OBJECT权限(无论是否带有BY子句),权限集必须包含SECADM权限。
如果语句嵌入在应用程序中,则权限集是指计划或包的所有者所拥有的权限。 主人可以是一个角色。 如果语句是动态准备的,则权限集是指进程的SQL授权ID所拥有的权限。 但是,如果进程在受信任的环境中运行,且该环境由角色作为对象所有者和限定者条款定义,则权限集是指当前角色所拥有的权限。
语法 REVOKE
描述 REVOKE
- 授权规格
- 为特权类别指定一项或多项特权。 同一特权不得重复使用。
- FROM
- 指定从哪些授权ID撤销特权。
- 授权名称,...
- 列出一个或多个授权标识。 请勿多次使用同一个授权ID。 如果授权名称以小写形式指定,则必须使用双引号将其括起来。当前规则(CURRENT RULES)的值决定了是否可以使用撤销(REVOKE)语句本身的标识(以撤销自己的权限)。 当前规则为:
- Db2
- 您不能使用 REVOKE 语句的 ID。
- std
- 您可以使用REVOKE语句的ID。
- ROLE role-name
- 列出一种或多种角色。 请勿重复填写同一职位。
- PUBLIC
- 撤销对公众的特权授予。
- BY
- 列出授予特权的人,并撤销每个被指定授予人明确授予某个指定用户的特权。 只有具有 SYSADM 或 SYSCTRL 权限的授权 ID 或角色才能使用 BY,即使授权 ID 或角色名称仅在 BY 子句中引用自身。
- 授权名称……
- 列出作为所列权限授予者的用户的一个或多个授权ID。 请勿重复使用同一个授权ID。 列出的每个授权者必须明确授予所有指定用户或角色一些指定的权限。
- ROLE role-name
- 列出一个或多个享有所述特权的角色。 请勿重复填写同一职位。 列出的每个授权者必须明确授予所有指定用户或角色一些指定的权限。
- 全部
- 撤销所有明确授予特权的用户(无论由谁授予)的特权。
- INCLUDING DEPENDENT PRIVILEGES 或者 NOT INCLUDING DEPENDENT PRIVILEGES
- 指定撤销授权ID或角色的特权或权限是否也会导致撤销该用户授予的权限。 默认值基于被撤销的权限和系统参数 REVOKE_DEP_PRIVILEGES:
- 当ACCESSCTRL、DATAACCESS或系统DBADM权限被撤销时, NOT INCLUDING DEPENDENT PRIVILEGES ,且必须在REVOKE语句中指定该子句。
- 当系统参数 REVOKE_DEP_PRIVILEGES 设置为 NO 时, NOT INCLUDING DEPENDENT PRIVILEGES ,如果语句中包含 INCLUDING DEPENDENT PRIVILEGES。
- 否则, INCLUDING DEPENDENT PRIVILEGES ,则该条款必须在REVOKE语句中指定。
- INCLUDING DEPENDENT PRIVILEGES
- 规定撤销授权ID或角色的特权或权限也会导致撤销从属特权。 这意味着用户发放的任何赠金将继续被撤销,直到链中的所有赠金都被撤销。
INCLUDING DEPENDENT PRIVILEGES 如果系统参数 REVOKE_DEP_PRIVILEGES 设置为 NO,则无法指定,这将强制行为不包括相关权限。
- NOT INCLUDING DEPENDENT PRIVILEGES
- 规定撤销授权ID或角色的特权或权限不会导致撤销用户授予的权限。 然而,对于被撤销的特权,所有因特权被撤销而产生的后果均适用。 例如,如果需要被撤销的权限才能成功绑定一个软件包,那么由于软件包所有者失去了这些权限,该软件包将继续处于无效状态。 如果用于创建对象的特权被撤销,对象可能会被删除。
NOT INCLUDING DEPENDENT PRIVILEGES 当ACCESSCTRL、DATAACCESS或系统DBADM权限被撤销时,必须指定。
NOT INCLUDING DEPENDENT PRIVILEGES 如果系统参数 REVOKE_DEP_PRIVILEGES 设置为 toYES, ,则无法指定,该参数强制在撤销中包含相关权限。
- RESTRICT
- 在特定条件下,防止所列特权被撤销。 RESTRICT 仅对 REVOKE 语句的某些形式有效。 这些形式正在撤销对不同类型的USAGE权限、对用户定义函数和存储过程的EXECUTE权限、对序列的USAGE权限以及对变量的READ或WRITE权限。
备注 REVOKE
以下注意事项适用于所有撤销声明表格:
- 撤销特权
- 从授权ID或角色中撤销的权限是指声明中列出的、授予者授予用户的权限。 其他特权可能会因附属特权的撤销而失效。 有关 Db2 特权的更多信息,请参阅特权和权限。
- 撤销附属特权
- 撤销用户的特权也会导致其他用户的特权被撤销。 这以前被称为级联撤销。 当撤销授权ID或角色的特权时, Db2 会查找并撤销与原始撤销的授权ID或角色相同的任何特权授予。 当 U1 撤销 U3 的特权P时,以下规则必须成立,才能撤销 的特权P: U2:
- P和P'享有同等的特权。
- U2 授予特权 P' 至。 U3
- 在 U1 授予之前,没有人授予 U2 特权P。
- U2 没有安装SYSADM权限。
这些规则也适用于CREATE VIEW语句产生的隐式授权。
在以下任何一种情况下,都不会撤销附属特权:
- 当执行“撤销”语句时,当前拥有 SYSADM 权限的用户授予了该特权。
- 特权是指对特定类型的车辆的使用权,而拥有者有权使用以下任何一项:
- 使用不同类型的自定义函数或存储过程
- 表格中有一列使用了不同的类型
- 数据类型为唯一类型的序列
- 特权是指序列号的使用权,而拥有者有权处置以下任何物品:
- 一个具有NEXT VALUE或PREVIOUS VALUE表达式的触发器,用于指定序列
- 在函数体内具有NEXT VALUE或PREVIOUS VALUE表达式的内联SQL函数,用于指定序列
- 特权是指对用户自定义函数的执行特权,而撤销者拥有以下任意一项:
- 用户自定义函数,源自函数
- 使用该功能的视图
- 使用触发功能的软件包
- 在检查约束或用户定义的默认类型中使用该函数的表
- 特权是指对存储过程的EXECUTE特权,撤销则拥有以下任意一项:
- 触发器包,用于调用存储过程。
- 如果ACCESSCTRL管理权限被撤销,则该ACCESSCTRL用户授予的权限不会被撤销。
如果用户撤销了授予,则这些撤销将继续撤销从属特权,除非通过使用系统参数 REVOKE_DEP_PRIVILEGES 或在 REVOKE_DEP_PRIVILEGES 设置为 SQLSTMT 时使用 REVOKE 语句指定了不包含从属特权的行为。
- 如果SECADM从用户中删除,则该SECADM用户授予的权限不会撤销。
如果用户撤销了授予,则这些撤销将继续撤销从属特权,除非通过使用系统参数 REVOKE_DEP_PRIVILEGES 或在 REVOKE_DEP_PRIVILEGES 设置为 SQLSTMT 时使用 REVOKE 语句指定了不包含从属特权的行为。
- 如果 NOT INCLUDING DEPENDENT PRIVILEGES 选项,则不会撤销该用户的赠款。
以下示例请参考图表:
- 假设BOB将SYSADM权限授予WADE。 随后,CLAIRE向WADE授予了带有WITH GRANT OPTION的SELECT权限。
- WADE将SELECT权限授予了同一张表中的JOHN。
- 当CLAIRE从WADE那里撤销了表上的SELECT权限时,JOHN对该表的SELECT权限也被撤销了。
WADE对JOHN的拨款被取消,因为CLAIRE拨款之前,WADE从未从其他渠道获得过SELECT权限。 BOB授予WADE的SYSADM权限不会影响级联撤销。 有关 SYSADM 和安装 SYSADM 权限的更多信息,请参阅管理管理权限。 有关级联撤销的另一个示例,请参阅使用REVOKE语句撤销权限。
撤销用于创建视图或具体化查询表的 SELECT 权限会导致视图被删除,除非在创建视图之前,视图的所有者已从其他来源直接获得了 SELECT 权限。 撤销创建视图所需的 SYSADM 权限会导致视图被删除。 有关何时需要SYSADM权限来创建视图的详细信息,请参阅 CREATE VIEW语句中的授权。
- 包裹失效
- 撤销或逐级撤销为创建软件包而行使的任何特权或角色,当撤销者不再拥有任何其他来源的特权时,软件包即失效。 即使撤销者拥有任何其他来源的特权,相应的授权缓存也会被清除。 更多信息,请参阅 “导致套餐失效的变更 ”。 1
- 无效的套餐
- 撤销或逐级撤销用于创建包的用户定义函数的EXECUTE权限,会使包无法运行,并导致相应的授权缓存被清除,前提是撤销者不再拥有任何其他来源的权限。1
- 属于权威机构的特权
- 你可以撤销行政授权,但不能单独撤销该行政授权所固有的特定特权。
设P为权力X所固有的特权。 拥有权限X的用户也可以通过明确授予获得权限P。 在这种情况下:
- 如果X被撤销,用户仍然拥有特权P。
- 如果P被撤销,用户仍然享有特权,因为这是X固有的。
- 在信任的环境中撤销特权
- 在可信环境中,通过“作为对象所有者的角色”条款撤销,撤销者将成为实际角色。 如果语句是动态准备的,则撤销者是与运行语句的用户关联的角色。 如果声明嵌入程序中,则撤销者是计划或程序包的所有者。 如果未为可信上下文指定“作为对象所有者的角色”子句,则撤销者是该过程的授权ID。
- 车主特权
- 拥有一件物品所固有的特权是不可剥夺的。
- 撤销不包括附属特权
- 当通过指定 NOT INCLUDING DEPENDENT PRIVILEGES,则该用户授予的权限不会撤销,授予者也不会改变。 如果该用户后来获得了相同的权限,然后通过指定 INCLUDING DEPENDENT PRIVILEGES,那么该用户之前授予的所有权限也将被撤销。 参考以下示例:用户 U1 被授予对表 T1 的SELECT权限,并附带GRANT OPTION:
- U1 将此权限授予。 U2
- U1 的SELECT权限被撤销,不包含从属权限。 因此, U1 对 U2 的资助并未撤销。
- U1 再次被授予 的SELECT权限。 T1
- 现在, U1 的SELECT权限(包括附属权限)已被撤销, U1 对 U2 的授权也被撤销。
用户 U1 被授予SYSADM权限:- U1 授予 访问 的权限,授予 访问 的权限。 P1 U2 P2 U3
- SYSADM已从 U1 撤销,不包含从属权限。 P1 和 P2 对 U2 和 U3 的特权授予并未撤销。
- U1 再次被授予SYSADM权限。 U1 授予 对 的权限。 P3 U3
- SYSADM现在已从 U1 撤销,包括附属权限。 现在, P1 授予 U2 和 P2 , P3 授予 U3 的授权也被撤销。
