功能描述
定义新的操作符类。
语法格式
CREATE OPERATOR CLASS name [ DEFAULT ] FOR TYPE data_type
USING index_method [ FAMILY family_name ] AS
{ 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 [, ...] )
| STORAGE storage_type
} [, ... ]
参数说明
- name:新的操作符类名称,可以被模式修饰;
- DEFAULT:如果指定,则该操作符类将成为该数据类型的默认操作符类,每种特定的数据类型和索引最多有一个默认操作符类;
- data_type:这个操作符类所用于的列数据类型;
- index_method:这个操作符类所用于的索引方法的名称;
- family_name:要把这个操作符类加入其中的已有操作符族的名称,如果没有指定将使用一个同名操作符族,如果还不存在就创建一个;
- strategy_number:用于一个与该操作符类相关联的操作符的索引方法的策略编号;
- operator_name:一个与该操作符类相关联的操作符的名称,可以被模式修饰;
- op_type:表示该操作符的操作数数据类型;
- sort_family_name:现有btree操作符族的名称,可以被模式修饰;
- support_number:用于与该操作符类相关联的函数的索引方法支持过程编号;
- function_name:用于该操作符类的索引方法支持过程的函数名称,可以被模式修饰;
- argument_type:该函数的参数数据类型;
- storage_type:实际存储在索引中的数据类型
注意事项
OPERATOR、FUNCTION和STORAGE 子句可以以任何顺序出现。
范例
下面的例子为数据类型_int4(int4数组)定义了一个 GiST 索引操作符:
CREATE OPERATOR CLASS gist__int_ops
DEFAULT FOR TYPE _int4 USING gist AS
OPERATOR 3 &&,
OPERATOR 6 = (anyarray, anyarray),
OPERATOR 7 @>,
OPERATOR 8 <@,
OPERATOR 20 @@ (_int4, query_int),
FUNCTION 1 g_int_consistent (internal, _int4, smallint, oid, internal),
FUNCTION 2 g_int_union (internal, internal),
FUNCTION 3 g_int_compress (internal),
FUNCTION 4 g_int_decompress (internal),
FUNCTION 5 g_int_penalty (internal, internal, internal),
FUNCTION 6 g_int_picksplit (internal, internal),
FUNCTION 7 g_int_same (_int4, _int4, internal);
语法兼容
CREATE OPERATOR CLASS是PostgreSQL扩展。
相关语法
ALTER OPERATOR CLASS, DROP OPERATOR CLASS, CREATE OPERATOR FAMILY, ALTER OPERATOR FAMILY, DROP OPERATOR FAMILY
功能描述
定义新的操作符族。
语法格式
CREATE OPERATOR FAMILY name USING index_method
参数说明
- name:新的操作符族的名称,可以被模式修饰;
- index_method:操作符族所属的索引的名称。
注意事项
只有系统管理员用户有权限创建操作符族。
语法兼容
CREATE OPERATOR FAMILY是PostgreSQL扩展。
相关语法
ALTER OPERATOR FAMILY, DROP OPERATOR FAMILY, CREATE OPERATOR CLASS, ALTER OPERATOR CLASS, DROP OPERATOR CLASS
功能描述
对表创建行级安全性策略。
语法格式
CREATE POLICY name ON table_name
[ AS { PERMISSIVE | RESTRICTIVE } ]
[ FOR { ALL | SELECT | INSERT | UPDATE | DELETE } ]
[ TO { role_name | PUBLIC | CURRENT_USER | SESSION_USER } [, ...] ]
[ USING ( using_expression ) ]
[ WITH CHECK ( check_expression ) ]
参数说明
- name:新建的安全性策略名称,同一个数据表上安全性策略名称不能相同;
- table_name:安全性策略的表名;
- PERMISSIVE:指定将策略创建为宽松策略,即将所有查询策略使用“OR”运算符组合在一起;
- RESTRICTIVE:指定将该策略创建为限制性策略,即将所有查询策略使用“AND”运算符组合在一起;
- command:该策略的命令,取值范围:ALL、SELECT、INSERT、UPDATE以及DELETE,缺省为ALL;
- role_name:该策略应用的角色,缺省为PUBLIC,将把策略应用到所有角色;
- using_expression:安全性策略控制的表达式,返回boolean值,该表达式不能包含任何聚集函数或窗口函数,在查询重写阶段,如果数据表的行访问控制开关打开,满足条件的表达式会添加到计划树中。针对数据表的每条元组,会进行表达式计算,只有表达式返回值为TRUE时,行数据对用户才可见(SELECT、UPDATE、DELETE);当表达式返回FALSE时,该元组对当前用户不可见,用户无法通过SELECT语句查看此元组,无法通过UPDATE语句更新此元组,无法通过DELETE语句删除此元组;
- check_expression:安全性策略控制的表达式,返回boolean值,该表达式不能包含任何聚集函数或窗口函数,在查询重写阶段,如果数据表的行访问控制开关打开,满足条件的表达式会添加到计划树中。针对数据表的每条元组,会进行表达式计算,只有表达式返回值为TRUE时,行数据对用户才可见(INSERT、UPDATE);当表达式返回FALSE或NULL时,会报错,注意check_expression是根据新内容而不是原始内容计算的。
针对每种命令的策略
- ALL:为一条策略使用ALL表示它将适用于所有命令,无论命令的类型如何;
- SELECT:为一条策略使用SELECT表示它将适用于SELECT查询,并且需要保持在约束关系上的SELECT权限;
- INSERT:为一条策略使用INSERT表示它适用于INSERT命令;
- UPDATE:为一条策略使用UPDATE表示它适用于 UPDATE、SELECT FOR UPDATE 和SELECT FOR SHARE命令,还有INSERT 命令的ON CONFLICT DO UPDATE子句;
- DELETE:为一条策略使用DELETE表示它适用于DELETE命令,只有通过这条策略的数据才能被DELETE;
注意事项
当不同命令类型的多个策略应用于相同命令时(例如,应用于UPDATE命令的SELECT和UPDATE策略),则用户必须拥有两种类型的权限。
当同一命令类型的多个策略应用于同一个命令时,必须至少有一个允许访问该关系的 PERMISSIVE策略,并且必须通过所有的RESTRICTIVE策略。
范例
CREATE TABLE test_r(id int, role varchar(100), data varchar(100));
CREATE TABLE
CREATE POLICY test_rls ON test_r USING(role = CURRENT_USER);
CREATE POLICY
语法兼容
CREATE POLICY是PostgreSQL扩展。
相关语法
ALTER POLICY, DROP POLICY, ALTER TABLE
功能描述
创建角色。
语法格式
CREATE ROLE name [ [ WITH ] option [ ... ] ]
where option可以是:
SUPERUSER | NOSUPERUSER
| CREATEDB | NOCREATEDB
| CREATEROLE | NOCREATEROLE
| INHERIT | NOINHERIT