===================== ALTER OPERATOR FAMILY ===================== .. container:: refentry :name: SQL-ALTEROPFAMILY .. container:: titlepage .. container:: refnamediv .. rubric:: ALTER OPERATOR FAMILY :name: alter-operator-family ALTER OPERATOR FAMILY — 更改一个操作符族的定义 .. container:: refsynopsisdiv .. rubric:: 大纲 :name: 大纲 .. code:: synopsis ALTER OPERATOR FAMILY name USING index_method ADD { OPERATOR strategy_number operator_name ( op_type, op_type ) [ FOR SEARCH | FOR ORDER BY sort_family_name ] | FUNCTION support_number [ ( op_type [ , op_type ] ) ] function_name [ ( argument_type [, ...] ) ] } [, ... ] ALTER OPERATOR FAMILY name USING index_method DROP { OPERATOR strategy_number ( op_type [ , op_type ] ) | FUNCTION support_number ( op_type [ , op_type ] ) } [, ... ] ALTER OPERATOR FAMILY name USING index_method RENAME TO new_name ALTER OPERATOR FAMILY name USING index_method OWNER TO { new_owner | CURRENT_USER | SESSION_USER } ALTER OPERATOR FAMILY name USING index_method SET SCHEMA new_schema .. container:: refsect1 :name: id-1.9.3.22.5 .. rubric:: 描述 :name: 描述 ``ALTER OPERATOR FAMILY``\ 更改一个操作符族 的定义。你能增加操作符以及支持函数到该家族、从该族中移除它们或者更改 该族的名称或者拥有者。 在用\ ``ALTER OPERATOR FAMILY``\ 增加操作符和 支持函数到一个族中时,它们不是族内任何特定操作符类的组成部分,而只是 “松散”地存在于该族中。这表示这些操作符和函数与该族的语义兼 容,但是没有被任何特定索引的正确功能所要求(所要求的操作符和函数应该 被作为一个操作符类的一部分声明,见\ `CREATE OPERATOR CLASS `__\ )。 OushuDB 将允许一个族的松散成员在 任何时候被从该族中删除,但是在删除一个操作符类的成员之前,必须已经删 除整个类以及依赖于该成员的索引。具有代表性的是,单一数据类型操作符和 函数是操作符类的一部分,因为在特定数据类型上的索引需要它们的支持。而 多数据类型操作符和函数则被作为该族的松散成员。 要使用\ ``ALTER OPERATOR FAMILY``\ ,你必须是超级用户( 做这样的限制是因为一个错误的操作符族定义可能会迷惑服务器甚至让它崩溃)。 ``ALTER OPERATOR FAMILY``\ 目前不检测操作符族 定义是否包括该索引方法所要求的所有操作符和函数,也不检查操作符和函数是 否形成了一个有理的集合。定义一个合法的操作符族是用户的责任。 .. container:: refsect1 :name: id-1.9.3.22.6 .. rubric:: 参数 :name: 参数 .. container:: variablelist ``name`` 一个现有操作符族的名称(可以是模式限定的)。 ``index_method`` 这个操作符族所应用的索引方法的名称。 ``strategy_number`` 与该操作符族相关的一个操作符的索引方法策略号。 ``operator_name`` 与该操作符族相关的一个操作符的名称(可以是模式限定的)。 ``op_type`` 在一个\ ``OPERATOR``\ 子句中指定该操作符的操作数数据类型, 或者用\ ``NONE``\ 来表示一个左一元或者右一元操作符。不同于 ``CREATE OPERATOR CLASS``\ 中类似的语法,操作数数据 类型总是必须被指定。 在一个\ ``ADD FUNCTION``\ 子句中指定该函数意图支持的操作数 数据类型(如果不同于该函数的输入数据类型)。对于 B-树比较函数和哈希 函数,有必要指定\ ``op_type``\ ,因为该函数的输入数据类型 总是正确的。对于 B-树排序支持函数和 GiST、SP-GiST 和 GIN 操作符类中 的所有函数,有必要指定该函数要使用的操作数数据类型。 在一个\ ``DROP FUNCTION``\ 子句中,必须指定该函数要支持的操 作数数据类型。 ``sort_family_name`` 一个现有\ ``btree``\ 操作符族的名称(可能是模式限定的), 它描述与一个排序操作符相关的排序顺序。 如果既没有指定\ ``FOR SEARCH``\ 也没有指定\ ``FOR ORDER BY``\ , 默认值是\ ``FOR SEARCH``\ 。 ``support_number`` 一个与该操作符族相关的函数的索引方法支持过程编号。 ``function_name`` 作为该操作符族的一种索引方法支持函数的函数名称(可以是模式限定的)。 如果没有指定参数列表,则该名称必须在其模式中唯一。 ``argument_type`` 该函数的参数数据类型。 ``new_name`` 该操作符族的新名称。 ``new_owner`` 该操作符族的新拥有者。 ``new_schema`` 该操作符族的新模式。 ``OPERATOR``\ 和\ ``FUNCTION``\ 子句可以以任何顺序出现。 .. container:: refsect1 :name: id-1.9.3.22.7 .. rubric:: 注解 :name: 注解 注意\ ``DROP``\ 语法只通过策略或者支持号以及输入数据类型指定该 操作符族中的“slot”。占用这个槽的操作符或函数的名称不会被提及。 还有,对于\ ``DROP FUNCTION``\ ,要指定的类型是该函数意图支持 的输入数据类型。对于 GiST、SP-GiST 以及 GIN 索引,可能无需对该函数的 实际输入参数类型做任何事情。 因为索引机制在使用函数之前不会检查其上的访问权限,包括一个操作符族中的 函数或操作符都等同于授予了其上的公共执行权限。这对于操作符族中很有用的 这类函数来说,这通常不成问题。 操作符应该由 SQL 函数定义。一个 SQL 函数很可能被内联到调用查询中,这将 阻止优化器识别出该查询匹配一个索引。 .. container:: refsect1 :name: id-1.9.3.22.8 .. rubric:: 示例 :name: 示例 下列示例命令为一个操作符族增加跨数据类型的操作符和支持函数,该操 作符族已经包含用于数据类型\ ``int4``\ 以及\ ``int2``\ 的 B-树 操作符类。 .. code:: programlisting ALTER OPERATOR FAMILY integer_ops USING btree ADD -- int4 vs int2 OPERATOR 1 < (int4, int2) , OPERATOR 2 <= (int4, int2) , OPERATOR 3 = (int4, int2) , OPERATOR 4 >= (int4, int2) , OPERATOR 5 > (int4, int2) , FUNCTION 1 btint42cmp(int4, int2) , -- int2 vs int4 OPERATOR 1 < (int2, int4) , OPERATOR 2 <= (int2, int4) , OPERATOR 3 = (int2, int4) , OPERATOR 4 >= (int2, int4) , OPERATOR 5 > (int2, int4) , FUNCTION 1 btint24cmp(int2, int4) ; 再次移除这些项: .. code:: programlisting ALTER OPERATOR FAMILY integer_ops USING btree DROP -- int4 vs int2 OPERATOR 1 (int4, int2) , OPERATOR 2 (int4, int2) , OPERATOR 3 (int4, int2) , OPERATOR 4 (int4, int2) , OPERATOR 5 (int4, int2) , FUNCTION 1 (int4, int2) , -- int2 vs int4 OPERATOR 1 (int2, int4) , OPERATOR 2 (int2, int4) , OPERATOR 3 (int2, int4) , OPERATOR 4 (int2, int4) , OPERATOR 5 (int2, int4) , FUNCTION 1 (int2, int4) ; .. container:: refsect1 :name: id-1.9.3.22.9 .. rubric:: 兼容性 :name: 兼容性 在 SQL 标准中没有 ``ALTER OPERATOR FAMILY``\ 语句。 .. container:: refsect1 :name: id-1.9.3.22.10 .. rubric:: 另见 :name: 另见 `CREATE OPERATOR FAMILY `__, `DROP OPERATOR FAMILY `__, `CREATE OPERATOR CLASS `__, `ALTER OPERATOR CLASS `__, `DROP OPERATOR CLASS `__