GBase 8s SQL 指南:语法 南大通用数据技术股份有限公司 811 何时在 GRANT 之前使用 REVOKE 您可使用 REVOKE 与 GRANT 的组合来以特定的用户替代 PUBLIC 作为被授 予者,并移除对一些列的表级权限。 以指定的用户替代 PUBLIC 如果表所有者将权限授予 PUBLIC,则该所有者不可从任何特定的用户取消同一 权限。例如,假设 PUBLIC 对您的 customer 表有缺省的 Select 权限。假设您 发出下列语句,尝试阻止 ted 访问您的表: REVOKE ALL ON customer FROM ted; 此语句导致 ISAM 错误消息 111,No record found,因为系统目录表 (syscolauth 或 systabauth)未包含名为 ted 的用户的表级权限条目。此 REVOKE 操作不阻止 ted 保持所有赋予 PUBLIC 的对 customer 表的表级权 限。 要限制表级权限,首先以 PUBLIC 关键字取消该权限,然后将它们重新授予某适 当的用户和角色列表。下列语句从所有用户取消对 customer 表的 Index 和 Alter 权限,然后特定地将这些权限授予用户 mary: REVOKE INDEX, ALTER ON customer FROM PUBLIC; GRANT INDEX, ALTER ON customer TO mary; 限制对特定列的访问 不同于 GRANT,REVOKE 语句没有语法来对表中的列的子集指定权限。要从用 户取消对列的 Select、Update 或 References 权限,您必须对该表的所有列取消该 权限。要提供对您先前已在其上授予了权限的一些列的访问,请发出新的 GRANT 语句来恢复对特定列的适当的权限。 下一示例取消 PUBLIC 对特定列的 Select 权限: REVOKE SELECT ON customer FROM PUBLIC; GRANT SELECT (fname, lname, company, city) ON customer TO PUBLIC; 在下一示例中,mary 首先获得对 customer 中四列的引用能力,然后该表拥有者 将引用限定为两列: GRANT REFERENCES (fname, lname, company, city) ON customer TO mary; REVOKE REFERENCES ON customer FROM mary;
GBase 8s SQL 指南:语法 南大通用数据技术股份有限公司 812 GRANT REFERENCES (company, city) ON customer TO mary; ALL 关键字的作用 ALL 关键字取消所有表级权限。如果对于被取消者任何或所有表级权限不存在, 则带有 ALL 关键字的 REVOKE 执行成功但返回下列 SQLSTATE 代码: 01006--Privilege not revoked 例如,假设用户 hal 有对 customer 表的 Select 和 Insert 权限。用户 jocelyn 想要从用户 hal 取消所有表级权限。于是用户 jocelyn 发出下列 REVOKE 语 句: REVOKE ALL ON customer FROM hal; 此语句执行成功但返回 SQLSTATE 代码 01006。返回该 SQLSTATE 警告是因为下 列二者都为真: 该语句成功地从用户 hal 取消 Select 和 Insert 权限,因为用户 hal 有 那些权限。 返回 SQLSTATE 代码 01006 是因为用户 hal 缺少通过 ALL 关键字隐 含的其他权限,但这些权限还未被取消。 ALL 关键字指示数据库管理器来取消所有可能的权限,包括无任何权限。如果从 其取消权限的用户没有对该表的权限,则 REVOKE ALL 语句仍然成功,因为它 从该用户取消所有可能的权限(在此情况下,根本没有权限)。 ALL 关键字对 UNDER 权限的作用 如果您对类型表取消 ALL 权限,则 Under 权限包括在被取消的权限之中。如果 您对不是基于 ROW 类型的表取消 ALL 权限,则 Under 权限不包括在被取消的 权限之中。(仅可对类型表授予 Under 权限。) 未提交的事务的影响 REVOKE 对取消权限的表在 systables 系统目录表中的条目上放置一排他的行 锁。直到包含 REVOKE 语句的事务终止,才释放此锁。当另一事务尝试对此表 准备 SELECT 语句,而第一个事务是打开的,则并发事务失败,因为指定的表的 systables 行仍然排他地锁定着。直到第一个事务或提交或回滚,要准备 SELECT 语句的尝试才可成功。
GBase 8s SQL 指南:语法 南大通用数据技术股份有限公司 815 在符合 ANSI 的数据库中,owner 名称必须限定 routine 名称,除非发出 REVOKE 语句的用户为该例程的所有者。 下列示例取消用户 mark 对由 luke 所拥有的 delete_order 例程的 Execute 权 限: REVOKE EXECUTE ON ROUTINE luke.delete_order FROM mark;
在 GBase 8s 中,任何您授予 Execute 权限的取反函数都需要单独的、显式的 REVOKE 语句。 当您在任何下列环境之下创建 UDR,都不会缺省地授予 PUBLIC Execute 权限。 因此,在您可取消它之前,您必须显式地授予 Execute 权限: 您在符合 ANSI 的数据库中创建 UDR。 您有 DBA 权限且在 CREATE 关键字之后指定 DBA 来将 Execute 权 限限定给拥有 DBA 数据库级权限的用户。 NODEFDAC 环境变量设置为 yes 来防止 PUBLIC 收到任何未被显式 地授予的权限。 但如果您在没有任何那些条件生效的情况下创建 UDR,则 PUBLIC 可无需 GRANT EXECUTE 语句即可执行您的 UDR。要限定谁可执行您的 UDR,请通 过 FROM PUBLIC 取消 Execute 权限,并将它授予用户(请参阅 用户列表)或 角色(请参阅 角色名称)。 在 GBase 8s 中,如果两个或多个 UDR 有相同的名称,则请从此列表使用关键 字来指定用户列表可不再执行那些 UDR 中的哪些。 关键字 防止用户执行的 UDR SPECIFIC 通过 specific name 标识的 UDR FUNCTION 任何带有指定的 routine name 的函数(以及与 routine 参 数列表相匹配的参数类型,如果指定的话) PROCEDURE 任何带有指定的 routine name 的过程(以及与 routine 参 数列表相匹配的参数类型,如果指定的话)
GBase 8s SQL 指南:语法 南大通用数据技术股份有限公司 816 ROUTINE 带有指定的 routine name 的函数或过程(以及与 routine 参数列表相匹配的参数类型,如果指定的话) 语言级权限 要注册或删除用 SPL、C 或 Java™ 语言编写的 UDR,用户必须持有对用以编写 该例程的编程语言的 Usage 权限。 这是对于指定要取消的语言级权限的 USAGE ON LANGUAGE 子句的语法: 语言级权限
每一 REVOKE USAGE ON LANGUAGE 语句可指定不多于一种编程语言。 当用户注册以 SPL、C 或 Java 语言编写的 UDR 时,数据库服务器验证该用户 是否有对用以编写该 UDR 的语言的 Usage 权限。 如果该用户不具权限,则 CREATE FUNCTION 或 CREATE PROCEDURE 语句失败并报错。 如果 IFX_EXTEND_ROLE 配置参数已启用内建的 EXTEND 角色,则仅还持有那个角 色的用户可注册或删除以 C 语言或以 Java 语言编写的 UDR,即使用户持有对 那些语言的 USAGE ON LANGUAGE 权限。 要从用户或角色取消对编程语言的 Usage 权限,请发出包括 USAGE ON LANGUAGE 关键字和指定该编程语言的关键字的 REVOKE 语句。如果此语句成功,则任何您 在 FROM 子句中指定的用户或角色都可不再注册那些以该语言编写的 UDR。例 如,如果您从 PUBLIC 取消对 SPL 的缺省的 Usage 权限,则从所有用户剥夺创 建 SPL 例程的能力(除了那些已被单独地授予了对该 SPL 语言的 Usage 权限的 用户,或通过角色持有那 Usage 权限的用户之外): REVOKE USAGE ON LANGUAGE SPL FROM PUBLIC; 您可发出 GRANT USAGE ON LANGUAGE 语句来给受限的组恢复对 SPL 的 Usage 权 限,比如,给名为 developers 的角色: GRANT USAGE ON LANGUAGE SPL TO developers;
元素 描述 限制 语法 owner 序列或其同义词的所有者 必须为所有者 所有者名称 sequence 要取消其权限的序列 必须存在 标识符 synonym 序列对象的同义词 必须指向序列 标识符 序列必须驻留在当前的数据库中。(您可以有效的 owner 名称限定 sequence 或 synonym 标识符,但远程的 database 的名称(或 database@server)为无效限定 符。)取消序列级权限的语法是对 SQL 的 ANSI/ISO 标准的扩展。 Alter 权限 您可从另一用户、从 PUBLIC 或从角色取消对序列的 Alter 权限。Alter 权限使 得指定的用户或角色能以 ALTER SEQUENCE 语句修改序列的定义,或以 RENAME SEQUENCE 语句重命名该序列。 下列 REVOKE 语句取消分别授予用户 mark 对 cust_seq 序列对象的任何 Alter 权限: REVOKE ALTER ON cust_seq FROM mark;
GBase 8s SQL 指南:语法 南大通用数据技术股份有限公司 818 Select 权限 您可从另一用户、从 PUBLIC 或从角色取消对序列的 Select 权限。 Select 权限使得用户或角色能使用 SQL 语句中的 sequence.CURRVAL 和 sequence.NEXTVAL 来访问和增大序列的值。 下列 REVOKE 语句取消单独地授予用户 mark 对 cust_seq 序列对象的任何 Select 权限: REVOKE SELECT ON cust_seq FROM mark; ALL 关键字 您可使用 ALL 关键字来从另一用户、从 PUBLIC 或从角色同时取消 Alter 和 Select 权限。 下例取消用户 mark 对 cust_seq 序列对象持有的任何 Alter 和 Select 权限: REVOKE ALL ON cust_seq FROM mark; 在此语句执行之后,mark 是否仍可访问 cust_seq 取决于该用户是否仍持有授予 PUBLIC 的对 cust_seq 的 Alter 或 Select 权限,或他是否持有已授予了的对 cust_seq 的未取消的权限的角色。 用户列表 跟在 REVOKE 的 FROM 关键字之后的授权标识符(或 PUBLIC 关键字)指定 失去取消了的权限或取消了的角色的用户。 如果您使用 PUBLIC 关键字作为用 户列表,则 REVOKE 语句从 PUBLIC 取消指定的权限或角色,从而从所有用户 到尚未显式地授予权限或角色的用户,或从未通过已收到的角色或权限而持有一 些其他角色的用户取消它们。 user list 可包含单个用户或多个用户的授权标识符,以逗号分隔。如果您使用 PUBLIC 关键字作为用户列表,则 REVOKE 语句从所有用户取消指定的权限。 用户列表
GBase 8s SQL 指南:语法 南大通用数据技术股份有限公司 819
元素 描述 限制 语法 user 您正在取消其权限的用户的登 录名 必须为有效的授权 标识符 所有者名称 在该列表中用户名称的拼写与在 GRANT 语句中的拼写完全一致。您可有选择地 在该列表中使用括起每一用户名称的引号来保留大小写。在符合 ANSI 的数据库 中,如果您不使用引号来定界 user,则以大写字母存储该用户的名称,除非在初 始化数据库服务器之前 ANSIOWNER 环境变量设置成了 1。 当您指定登录名时,可使用 REVOKE 语句和 GRANT 语句来有选择 地确保数据库对象的各种类型。要了解示例,请参阅 何时在 GRANT 之前使用 REVOKE。 角色名称 仅 DBA 或通过 WITH GRANT OPTION 被授予了角色的用户可取消角色或其权 限。用户不可取消自身的角色。 角色名称
元素 描述 限制 语法 role 有这些属性之一的角色: 失去现有的权限或角色 被用户或被另一角色失 去 必须存在。如果括在引号 之间,则 role 区分大小 写。 所有者 名称
GBase 8s SQL 指南:语法 南大通用数据技术股份有限公司 820 紧跟在 REVOKE 关键字之后,role 的名称指定要从用户列表取消的角色。然 而,在 FROM 关键字之后,role 的名称指定要从其取消访问权限(或另一角 色)的角色。如果没有其他的 REVOKE 选项与 user 或 role 规范相冲突,则同 一 FROM 子句可同时包括 user 和 role 名称。要从角色取消对角色的权限的语 法是对 SQL 的 ANSI/ISO 标准的扩展。 当您在 REVOKE 语句的 FROM 关键字之后包括 role,则从那个角色取消指定 的权限(或另一角色),但有那个角色的用户保留那些单独地授予给他们的任何 权限或角色。 如果您将 role 括在引号之间,则该名称区分大小写,且完全按照您输入的形式存 储。在符合 ANSI 的数据库中,如果您不使用引号作为定界符,则以大写字母形 式存储 role。 当您取消以 WITH GRANT OPTION 关键字授予了用户的角色时,您同时取消该 角色及授予它的选项。 下列示例展示 REVOKE role 的作用: 移除用户或从指定的角色中包含的项移除另一角色: REVOKE accounting FROM mary; REVOKE payroll FROM accounting; 从角色移除一个或多个访问权限: REVOKE UPDATE ON employee FROM accounting; 当您从角色取消表级权限时,您不可包括 RESTRICT 或 CASCADE 关键字。 取消缺省的角色 DBA 或数据库的所有者可以 GRANT DEFAULT ROLE 语句为一个或多个用户或 为 PUBLIC 定义缺省的角色。不同于非缺省的角色,当用户连接到数据库时,缺 省的角色自动地生效。直到 SET ROLE 语句激活该角色,非缺省的角色才生效。 缺省的角色可为被授予了那个缺省的角色的所有用户指定一系列访问权限。相反 地,REVOKE DEFAULT ROLE 语句为指定的 user-list 取消当前的缺省的角色 作为缺省的角色,如下列程序片段所示: CREATE ROLE accounting; GRANT USAGE ON LANGUAGE SPL TO accounting; GRANT ALL PRIVILEGES ON receivables TO accounting;
GBase 8s SQL 指南:语法 南大通用数据技术股份有限公司 821 GRANT DEFAULT ROLE accounting TO mary; . . . REVOKE DEFAULT ROLE FROM mary; 最后的语句从用户 mary 移除任何她仅通过她的缺省的角色所持有的任何访问权 限。在此示例中,该缺省的角色为 accounting,但由于在给定的时间点对于单个 用户(或 PUBLIC 组)可仅有一个角色,所以在 REVOKE DEFAULT ROLE 语 句中不指定缺省的角色的名称。如果 mary 发出 SET ROLE DEFAULT 语句,则 直到授予他某新的缺省的角色之后,它才会有效。 在您执行指定一个或多个用户或 PUBLIC 的 REVOKE DEFAULT ROLE 之后, 仅通过缺省的用户,才能取消那些用户持有的任何权限。(但此语句不取消单独 地授予了用户的任何权限,或通过另一角色授予了用户的权限,或 PUBLIC 持有 的权限。) 在 REVOKE DEFAULT ROLE 成功地取消 user 的缺省的角色之后,user 的缺 省的角色成为 NULL,且从系统目录移除该缺省的角色信息。(在此上下文中, NULL 与 NONE 是同义词。) 如果 REVOKE DEFAULT ROLE 指定尚未授予缺省的角色的用户,则不发出警 告。 除了 user-list 之外,在 REVOKE DEFAULT ROLE 语句中的 FROM 关键字之 后的选项都无效。 取消 EXTEND 角色 REVOKE EXTEND FROM user-list 语句取消指定用户的 EXTEND 角色。在启用 IFX_EXTEND_ROLE 配置参数的数据库中,取消此角色防止指定的用户创建或删 除外部 UDR。用户是否持有 EXTEND 角色对创建或删除以 SPL 语言编写的 UDR 没有作用。 仅数据库服务器管理员(DBSA),缺省为用户 gbasedbt,可通过发出 GRANT EXTEND TO user-list 语句将内建的 EXTEND 角色授予一个或多个用户或授予 PUBLIC。(由于 EXTEND 为内建的角色,因此持有它的用户不需要以 SET ROLE 语句激活它,且 DROP ROLE 语句不可销毁 EXTEND 角色。)
GBase 8s SQL 指南:语法 南大通用数据技术股份有限公司 822 如果 IFX_EXTEND_ROLE 配置参数设置为 ON 或为 1,则不持有 EXTEND 角色的用 户不可创建或删除以 C 或 Java™ 语言编写的 UDR,这两种语言都支持共享库。 下列示例从用户 max 取消 EXTEND 角色: REVOKE EXTEND FROM 'max'; 这防止用户 max 创建或删除外部的 UDR,即使 max 为它后续试图删除的那个 UDR 的所有者。 在不需要此安全特性的数据库中,DBSA 可通过设置 ONCONFIG 文件中的 IFX_EXTEND_ROLE 参数为 OFF 或为 0 来禁用对可创建或删除外部的 UDR 的用户 的限制。但不论启用或禁用 IFX_EXTEND_ROLE,创建或删除外部的 UDR 的用户还 必须持有下列访问权限: 对在其中注册 UDR 的数据库的 Resource 权限或 DBA 权限。 对以其编写 UDR 的外部编程语言的 Usage 权限。 要获取关于 Resource 权限的信息,请参阅 数据库级权限。要获取 SQL 的 GRANT USAGE ON LANGUAGE C 和 GRANT USAGE ON LANGUAGE JAVA 的语法,请参阅 语言级权限。 取消 WITH GRANT OPTION 授予的权限 如果您从 user 取消您使用 WITH GRANT OPTION 关键字授予的权限或角色, 则切断由那个 user 授予的权限的链条。 这样,当您从用户或从角色取消权限时,您还取消了在下列上下文中 GRANT 语句 所产生的相同的权限: 由您的被授予者发出的 允许,因为您的被授予者指定了 WITH GRANT OPTION 子句 允许,因为后续的被授予者使用 WITH GRANT OPTION 子句授予了相 同的权限或角色 在给特定的用户指定权限的 GRANT 语句中,仅 WITH GRANT OPTION 子句是 有效的。被授予者不可为 PUBLIC 组或角色。 下列示例展示权限的取消。假设您,作为表 items 的所有者,发出下列语句来将 访问权限授予用户 mary: REVOKE ALL ON items FROM PUBLIC; GRANT SELECT, UPDATE ON items TO mary WITH GRANT OPTION;
GBase 8s SQL 指南:语法 南大通用数据技术股份有限公司 823 然后,用户 mary 使用她的新权限来授予用户 cathy 和 paul 对 items 表的访 问: GRANT SELECT, UPDATE ON items TO cathy; GRANT SELECT ON items TO paul; 稍后,您从用户 mary 取消对 items 表的权限: REVOKE SELECT, UPDATE ON items FROM mary; 此单一语句有效地从用户 mary、cathy 和 paul 取消对 items 表的所有权限。 CASCADE 关键字与此缺省的情况有相同的作用。 AS 子句 若没有 AS 子句,执行 REVOKE 语句的用户必须为正被取消的权限 的授予者。DBA 或该对象的所有者可使用 AS 子句来指定另一用户 (必须为该权限的授予者)作为该权限的取消者。 AS 子句提供唯一的机制,可取消对其 owner 为诸如 gbasedbt 这样的授权标识 符的数据库对象的权限,该标识符还不是操作系统已知的有效的用户账户。 要了解 AS revoker 子句需要的,而不是可选的,上下文,请参阅 将 Execute 权 限从 PUBLIC 取消。 CASCADE 关键字对 UNDER 权限的作用 如果您以 CASCADE 选项取消对类型表的 Under 权限,则从指定的用户移除 Under 权限,并从数据库删除那个用户在该类型表之下创建的任何子表。 如果当那个数据类型正在使用时,您以 CASCADE 选项取消对命名的 ROW 类 型的 Under 权限,则 REVOKE 失败。对 CASCADE 选项的缺省的行为会发生 例外,因为数据库服务器支持仅带有 RESTRICT 关键字的 DROP ROW TYPE 语 句。 例如,假设用户 jeff 创建名为 rtype1 的 ROW 类型,并将对那个 ROW 类型 的 Under 权限授予用户 mary。现在,用户 mary 在 ROW 类型 rtype1 之下创 建名为 rtype2 的 ROW 类型,并将对 ROW 类型 rtype2 的 Under 权限授予用 户 andy。然后,用户 andy 在 ROW 类型 rtype2 之下创建名为 rtype3 的 ROW 类型。
GBase 8s SQL 指南:语法 南大通用数据技术股份有限公司 824 如果现在用户 jeff 试图以 CASCADE 选项从用户 mary 取消对ROW 类型 rtype1 的 Under 权限,则 REVOKE 语句失败,因为 ROW 类型 rtype2 仍在 被 ROW 类型 rtype3 所使用。 以 RESTRICT 选项控制 REVOKE 的作用域 当任何下列依赖存在时,RESTRICT 关键字导致 REVOKE 语句失败: 视图依赖于您正在尝试取消的 Select 权限。 外键约束依赖于您尝试取消的 References 权限。 您尝试从一用户取消权限,该用户后来将此权限授予了另一用户或角色。 如果 REVOKE 指定有将该权限授予其他用户的权限,但尚未使用那项权利的用 户,则 REVOKE 不会失败。例如,假设当用户 clara 将对 customer 表的 Select 权限授予用户 ted 时,它指定 WITH GRANT OPTION。进一步假设用户 ted,接着将对 customer 表的 Select 权限授予用户 tania。clara 发出了的下 列语句不起作用,因为 ted 已使用了它的授权来授予 Select 权限: REVOKE SELECT ON customer FROM ted RESTRICT; 相反,如果用户 ted 未将 Select 权限授予 tania 或任何其他用户,则同样的 REVOKE 语句成功。 即使 ted 确将 Select 权限授予另一用户,下列语句的每 一条均成功: REVOKE SELECT ON customer FROM ted CASCADE; REVOKE SELECT ON customer FROM ted; 安全管理选项 结合 GRANT 语句,REVOKE 语句通过指定哪些用户或角色持有需要访问数据 库或数据库之内的对象的权限,支持 GBase 8s 的自主访问控制(DAC)数据安 全特性。 REVOKE 语句的“安全管理选项”,与 GRANT 语句的对应选项相似,支持一系 列附加的数据安全特性,称为基于标签的访问控制(LBAC)。 这些特性使得 GBase 8s 能基于将包含在数据对象中的行安全标签或列安全标签与用户标签及其 他已经授予了正在寻求访问的用户的其他凭证进行比较,允许或拒绝对受保护的 数据的访问。 安全管理选项
元素 描述 限制 语法 role 要从其取消权限的角色 必须为角色的授权 标识符 所有者名称 user 在 FROM 关键字之后,是要从其 取消权限的用户。在 ON 关键字 之后,是被授权者可在 SET AUTHORIZATION 语句中指定其身 份的用户。 必须为用户的授权 标识符 所有者名称 仅持有 DBSECADM 角色的用户可取消 SETSESSIONAUTH 权限。 跟在 ON 关键字之后的用户或 PUBLIC 规范,指定在使用 SET SESSION AUTHORIZATION 语句时, SETSESSIONAUTH 权限的被授权者不再能够使用 谁的身份。这可为用户或 PUBLIC,但不可为角色。如果指定 PUBLIC,则该权 限的被授权者不再有能力使用任意数据库用户的身份。
GBase 8s SQL 指南:语法 南大通用数据技术股份有限公司 834 可跟在 FROM 关键字之后的 USER 和 ROLE 关键字是可选的。user 或 role 都不可为发出 REVOKE SETSESSIONAUTH 语句的 DBSECADM 角色的持有 者。FROM 子句不可指定 PUBLIC。 下例授予用户 sam 将会话授权设置为用户 lynette 和 manor 的能力: REVOKE SETSESSIONAUTH ON lynette, manoj TO sam; 下一示例从用户 lynette 取消将会话授权设置为 PUBLIC 的能力: REVOKE SETSESSIONAUTH ON PUBLIC FROM lynette; 此语句取消的权限的 PUBLIC 作用域已使得用户 lynette 能使用她在 SET SESSION AUTHORIZATION 语句中指定的任何用户的访问权限和安全凭证。