华为云用户手册

  • 使用示例 以当前两个用户自建的数据库db1、db2为例: 在CN上获取集群的所有残留文件记录: 1 db1=# SELECT * FROM pgxc_get_residualfiles() order by 4, 6; -- order by不是必须的 当前集群中: dn_6001_6002 节点(当前的主节点实例)的db1和db2数据库中都存在残留文件记录。 残留文件在residualfile 列展示。 filepath列为记录残留文件的记录文件,保存在实例数据目录下pg_residualfiles目录中。 调用pgxc_verify_residualfiles() 函数对db1库进行验证: 1 db1=# SELECT * FROM pgxc_verify_residualfiles(); 因为verify类函数都是database级别,所以当前在db1库中调用verify函数时,只对属于db1的残留文件进行验证。 可以再次调用get函数查看是否验证完成: 1 db1=# SELECT * FROM pgxc_get_residualfiles() order by 4, 6; 如上图所示,已确认db1数据库中的残留文件都已经验证,db2数据库中的残留文件都未进行验证。 调用 pgxc_rm_residualfiles()函数删除残留文件。 1 db1=# SELECT * FROM pgxc_rm_residualfiles(); 再次调用pgxc_get_residualfiles()函数检查删除后的结果。 结果显示db1数据库中的残留文件已经被删除(isdeleted标记为t),db2中的残留文件都未被删除。 同时可以看到查询出9条结果,与之前查询出的结果想比,缺少一条以9438结尾的残留文件记录文件。这是因为以9438结尾的残留文件记录文件中只有一条残留文件记录,这条记录在步骤3中被删除,当记录文件中的所有残留文件都被删除后,记录文件本身也会被删除,并备份到pg_residualfiles/backup目录中: 如果需要删除db2数据库中的文件,需要在db2中调用verify函数后再调用rm函数。 进入db2数据库,并调用验证函数: 此时可以查询验证的结果: 调用删除函数: 再查询删除的结果: 此时因为 8342 结尾的记录文件中残留文件已经全部删除,所以整个记录文件也被删除并备份到backup目录下,所以查询到0条记录。
  • 使用步骤 调用pgxc_get_residualfiles()函数,获取存在残留文件的数据库名称。 分别进入确认有残留文件的数据库,调用pgxc_verify_residualfiles()函数,对当前数据库中记录的残留文件进行验证。 调用pgxc_rm_residualfiles()函数,删除所有已经验证过的残留文件。 pgxc类残留文件管理函数只对CN和当前主DN进行操作,不会验证和清理备DN上的残留文件。所以主DN完成清理后,应在备DN上及时执行残留文件清理操作或对备机进行build,防止主备切换后由于增量build导致备机残留文件被重新复制回主DN,导致未成功清理的假象。
  • 处理查询 GaussDB(DWS)提供了函数和操作符用来操作tsquery类型的查询。 tsquery && tsquery 返回两个给定查询tsquery的与结果。 tsquery || tsquery 返回两个给定查询tsquery的或结果。 !! tsquery 返回给定查询tsquery的非结果。 numnode(query tsquery) returns integer 返回tsquery中的节点数目(词素加操作符),这个函数在检查查询是否有效(返回值大于0),或者只包含停用词(返回值等于0)时,是有用的。例如: 1 2 3 4 5 6 7 8 9 10 11 SELECT numnode(plainto_tsquery('the any')); NOTICE: text-search query contains only stop words or doesn't contain lexemes, ignored CONTEXT: referenced column: numnode numnode --------- 0 SELECT numnode('foo & bar'::tsquery); numnode --------- 3 querytree(query tsquery) returns text 返回可用于索引搜索的tsquery部分,该函数对于检测非索引查询是有用的(例如只包含停用词或否定项)。例如: 1 2 3 4 5 SELECT querytree(to_tsquery('!defined')); querytree ----------- T (1 row) 父主题: 附加功能
  • create_audit_csv_foregion_table() 描述:创建读审计日志的分区外表。用户调用该函数生成审计日志外表pgxc_audit_logs,通过读取pgxc_audit_logs可以读取放在obs上的审计日志信息。该函数仅8.2.1.300及以上集群支持。 入参: obs_server:text类型,obs server名称 file_path:text类型,obs文件路径 返回值类型:record 示例: --创建obs server CREATE SERVER obs_server FOREIGN DATA WRAPPER DFS_FDW OPTIONS ( address 'obs.xxx.xxx.xxx.com:xxx', encrypt 'true', access_key 'xxxxxxxxx', secret_access_key 'xxxxxxxxxxxxxx', type 'obs' ); --调用该函数生成审计日志外表 SELECT * FROM pg_catalog.create_audit_csv_foregion_table('obs_server','/obs-audit/test/'); create_audit_csv_foregion_table --------------------------------- t (1 row) --读取放在obs上的审计日志信息 SELECT * FROM pgxc_audit_logs where year=2023 and month=7 and date=24; year | month | date | begintime | endtime | operation_type | audit_type | result | username | database | client_conninfo | object_name | object_details |command_text| detail_info | transaction_xid | query_id | node_name | session_id | local_port | remote_port | result_rows | error_code ------+-------+------+----------------------------+----------------------------+----------------+-------------------+--------+----------+----------+-----------------+--------------------------------+----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+-----------------+--------------------+-----------+------------------------------------+------------+-------------+-------------+------------ 2023 | 7 | 24 | 2023-07-24 09:56:40.727+08 | 2023-07-24 09:56:42.215+08 | dml | dml_action_select | ok | dbadmin | gaussdb | gsql@[local] | public.pgxc_audit_logs | | select * f rom pgxc_audit_logs where year=2023 and date=24 and month=7;
  • pg_query_audit_details() 描述:查看审计日志并将审计日志中的object_name和object_details字段由json格式解析出来。该函数仅8.2.1.100及以上集群版本支持。 返回值类型:record 函数返回字段如下: 表4 pg_query_audit()函数返回字段 名称 类型 描述 begintime timestamp with time zone 操作的执行开始时间。 endtime timestamp with time zone 操作的执行结束时间。 operation_type text 操作类型,具体类型见表2。 audit_type text 审计类型,具体类型见表3。 result text 操作结果。 username text 执行操作的用户名。 database text 数据库名称。 client_conninfo text 客户端连接信息,即gsql,jdbc或odbc。 transaction_xid text 事务ID。 query_id text 查询ID。 node_name text 节点名称。 session_id text 会话ID。 local_port text 本地端口。 remote_port text 远端端口。 object_name text 表名、函数名、视图名。 column_name text 列名。 type_of_use text 对象的使用类型: 1:仅涉及(在实际使用中,此标志位暂不存在) 2:执行过程中访问(语句中出现的列以及在解析过程中访问到的列) 4:条件中发现(条件类型语句中,不包括条件表达式及函数) 8:inner join中发现 16:outer join中发现 32:聚合节点中发现(包括distinct、group by、聚集函数) 64:full join中发现 该列数值为叠加显示的数值。 use_type text type_of_use解析出的具体类型: 1:Reference only 2:Access 4:Conditional 8:Inner join 16:Outer join 32:Sum 64:Full join command_text text 操作的执行命令。 示例: 查询审计语句中所有对象的列及其在语句中使用的类型: 1 2 SET audit_object_details = on; SELECT object_name,object_details,result_rows,error_code,command_text FROM pg_query_audit('2023-05-12-03 8:00:00','2023-05-12 22:55:00') where command_text like '%student%'; 查询结果如下: 1 2 3 4 5 6 object_name | object_details | result_rows | error_code | command_text ------------------------------------------------------------------+------------------------------------------------------------------------------------------+-------------+------------+------------------------------------------------------------------------------------------------------------------------------------------------------- student | | 0 | | CREATE TABLE student(stuNo int, stuName TEXT); studentscore | | 0 | | CREATE TABLE studentscore(stuNo int, stuscore int); ["public.student_view01","public.studentscore","public.student"] | | 0 | | CREATE OR REPLACE VIEW student_view01 AS SELECT * FROM student t1 where t1.stuNo in (select stuNo from studentscore t2 where t1.stuNo = t2.stuNo); ["public.student_view01","public.student","public.studentscore"] | {"public.student":[{"stuno":"6"},{"stuname":"2"}],"public.studentscore":[{"stuno":"6"}]} | 0 | | SELECT * FROM student_view01 查询结果object_details中显示部分语句执行过程中,涉及到的列及其使用类型,使用json格式进行记录。 使用pg_query_audit_details函数对object_name和object_details列进行解析: 1 SELECT database,object_name,column_name,type_of_use,use_type FROM pg_query_audit_details('2021-02-03 8:00:00','2024-02-03 22:55:00','current') where command_text like '%student%'; 查询结果如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 database | object_name | column_name | type_of_use | use_type ----------+-----------------------+-------------+-------------+-------------------- gaussdb | student | | 2 | Access gaussdb | | | 2 | Access gaussdb | studentscore | | 2 | Access gaussdb | | | 2 | Access gaussdb | public.student_view01 | | 2 | Access gaussdb | public.studentscore | | 2 | Access gaussdb | public.student | | 2 | Access gaussdb | | | 2 | Access gaussdb | public.student | stuno | 6 | Access,Conditional gaussdb | public.student | stuname | 2 | Access gaussdb | public.studentscore | stuno | 6 | Access,Conditional gaussdb | public.student_view01 | | 2 | Access gaussdb | public.student | | 2 | Access gaussdb | public.studentscore | | 2 | Access gaussdb | | | 2 | Access (15 rows)
  • pg_query_audit() 描述:查看当前CN节点审计日志。 返回值类型:record 函数返回字段如下: 表1 pg_query_audit()函数返回字段 名称 类型 描述 begintime timestamp with time zone 操作的执行开始时间。 endtime timestamp with time zone 操作的执行结束时间。 operation_type text 操作类型,具体类型见表2。 audit_type text 审计类型,具体类型见表3。 result text 操作结果。 username text 执行操作的用户名。 database text 数据库名称。 client_conninfo text 客户端连接信息,即gsql,jdbc或odbc。 object_name text 操作对象名称。 object_details text 记录语句中涉及的列及其使用类型。 command_text text 操作的执行命令。 detail_info text 执行操作详细信息。 transaction_xid text 事务ID。 query_id text 查询ID。 node_name text 节点名称。 session_id text 会话ID。 local_port text 本地端口。 remote_port text 远端端口。 result_rows text 语句执行返回的记录数。 error_code text 语句执行错误时的错误码。 表2 operation_type操作类型项 操作类型 描述 audit_switch 表示对用户打开和关闭审计日志操作场景进行审计。 login_logout 表示对用户登录和登出操作场景进行审计。 system 表示对系统的启停、实例切换操作场景进行审计。 sql_parse 表示对SQL语句解析场景进行审计。 user_lock 表示对用户锁定和解锁操作的场景进行审计。 grant_revoke 表示对用户权限授予和回收操作场景进行审计。 violation 表示对用户访问存在越权的场景进行审计。 ddl 表示对DDL操作场景进行审计,因为DDL操作会根据操作对象进行更细粒度控制,仍然沿用审计开关audit_system_object,即由audit_system_object控制对哪些对象的DDL操作进行审计(此处不配置ddl,只要配置了audit_system_object,审计也会生效)。 dml 表示对DML操作场景进行审计。 select 表示对SELECT操作场景进行审计。 internal_event 表示对内部事件操作场景进行审计。 user_func 表示对用户自定义函数、存储过程、匿名块操作场景进行审计。 说明: 如果自定义函数、存储过程中有fetch语句,则审计fetch语句时,其中common_text字段记录的为其对应的CURSOR内容。 special_func 表示对特殊函数调用操作场景进行审计,特殊函数包括:pg_terminate_backend和pg_cancel_backend。 copy 表示对COPY操作场景进行审计。 set 表示对SET操作场景进行审计。 transaction 表示对事务操作场景进行审计。 vacuum 表示对VACUUM操作场景进行审计。 analyze 表示对ANALYZE操作场景进行审计。 cursor 表示对游标操作的场景进行审计。 anonymous_block 表示对匿名块操作场景进行审计。 explain 表示对EXPLAIN操作场景进行审计。 show 表示对SHOW操作场景进行审计。 lock_table 表示对锁表操作场景进行审计。 comment 表示对COMMENT操作场景进行审计。 preparestmt 表示对PREPARE、EXECUTE、DEALLOCATE操作场景进行审计。 cluster 表示对CLUSTER操作场景进行审计。 constraints 表示对CONSTRAINTS操作场景进行审计。 checkpoint 表示对CHECKPOINT操作场景进行审计。 barrier 表示对BARRIER操作场景进行审计。 cleanconn 表示对CLEAN CONNECTION操作场景进行审计。 seclabel 表示对安全标签操作进行审计。 notify 表示对通知操作进行审计。 load 表示对加载操作进行审计。 discard 表示对清理当前会话所有的全局临时表信息场景进行审计。 表3 audit_type审计类型项 审计类型 描述 audit_open/audit_close 表示审计类型为打开和关闭审计日志操作。 user_login/user_logout 表示审计类型为用户登录/退出成功的操作和用户。 system_start/system_stop/system_recover/system_switch 表示审计类型为系统的启停、实例切换操作。 sql_wait/sql_parse 表示审计类型为SQL语句解析。 lock_user/unlock_user 表示审计类型为用户锁定和解锁成功的操作。 grant_role/revoke__role 表示审计类型为用户权限授予和回收的操作。 user_violation 表示审计类型为用户访问存在越权的操作。 ddl_数据库对象 表示审计类型为DDL操作,因为DDL操作由会根据操作对象进行更细粒度控制,仍然沿用审计开关audit_system_object,即由audit_system_object控制对哪些对象的DDL操作进行审计(此处不配置ddl,只要配置了audit_system_object,审计也会生效)。 例如:ddl_sequence表示审计类型为序列相关操作。 dml_action_insert/dml_action_delete/dml_action_update/dml_action_merge/dml_action_select 表示审计类型为INSERT、DELETE、UPDATE、MERGE等DML操作。 internal_event 表示审计类型为内部事件。 user_func 表示审计类型为用户自定义函数、存储过程、匿名块操作。 说明: 如果自定义函数、存储过程中有fetch语句,则审计fetch语句时,其中common_text字段记录的为其对应的CURSOR内容。 special_func 表示审计类型为特殊函数调用操作,特殊函数包括:pg_terminate_backend和pg_cancel_backend。 copy_to/copy_from 表示审计类型为COPY相关操作。 set_parameter 表示审计类型为SET操作。 trans_begin/trans_commit/trans_prepare/trans_rollback_to/trans_release/trans_savepoint/trans_commit_prepare/trans_rollback_prepare/trans_rollback 表示审计类型为事务相关操作。 vacuum/vacuum_full/vacuum_merge 表示审计类型为VACUUM相关操作。 analyze/analyze_verify 表示审计类型为ANALYZE相关操作。 cursor_declare/cursor_move/cursor_fetch/cursor_close 表示审计类型为游标相关操作。 codeblock_execute 表示审计类型为匿名块。 explain 表示审计类型为EXPLAIN操作。 show 表示审计类型为SHOW操作。 lock_table 表示审计类型为锁表操作。 comment 表示审计类型为COMMENT操作。 prepare/execute/deallocate 表示审计类型为PREPARE、EXECUTE或DEALLOCATE操作。 cluster 表示审计类型为CLUSTER操作。 constraints 表示审计类型为CONSTRAINTS操作。 checkpoint 表示审计类型为CHECKPOINT操作。 barrier 表示审计类型为BARRIER操作。 cleanconn 表示审计类型为CLEAN CONNECTION操作。 seclabel 表示审计类型为安全标签操作。 notify 表示审计类型为通知操作。 load 表示审计类型为加载操作。 discard 表示审计类型为DISCARD操作。
  • gs_password_deadline() 描述:显示当前账户距离密码过期的时间。密码过期后提示用户修改密码。与GUC参数password_effect_time相关。 返回值类型:interval 示例: 1 2 3 4 5 SELECT gs_password_deadline(); gs_password_deadline ------------------------- 83 days 17:44:32.196094 (1 row)
  • login_audit_messages_pid(flag boolean) 描述:查看登录用户的登录信息。与login_audit_messages的区别在于结果基于当前backendid向前查找。所以不会因为同一用户的后续登录,而影响本次登录的查询结果。也就是查询不到该用户后续登录的信息。 返回值类型:元组 示例: 查看上一次登录认证通过的日期、时间和IP等信息: 1 2 3 4 5 SELECT * FROM login_audit_messages_pid(true); username | database | logintime | type | result | client_conninfo | backendid | session_id ------------+----------+------------------------+---------------+--------+--------------------+----------------------------------------- dbadmin | postgres | 2017-06-02 15:28:34+08 | login_success | ok | gsql@[local] | 140311900702464 | 1663745305.140192538154752.coordinator1 (1 row) 查看上一次登录认证失败的日期、时间和IP等信息: 1 2 3 4 SELECT * FROM login_audit_messages_pid(false) ORDER BY logintime desc limit 1; username | database | logintime | type | result | client_conninfo | backendid | session_id ------------+----------+------------------------+--------------+--------+-------------------------+------------ (0 rows) 查看自从最后一次认证通过以来失败的尝试次数、日期和时间: 1 2 3 4 SELECT * FROM login_audit_messages_pid(false); username | database | logintime | type | result | client_conninfo | backendid | session_id ------------+----------+------------------------+--------------+--------+-------------------------+------------ (0 rows)
  • gs_password_expiration() 描述:显示当前账户距离密码过期的时间。密码过期后用户无法登录数据库。与创建用户的DDL语句PASSWORD EXPIRATION period相关,函数返回值大于等于-1,如果创建用户时未指定PASSWORD EXPIRATION period,该函数的缺省值为-1,表示没有过期限制。 返回值类型:interval 示例: 1 2 3 4 5 SELECT gs_password_expiration(); gs_password_expiration ------------------------- 29 days 23:59:49.731482 (1 row)
  • login_audit_messages(flag boolean) 描述:查看登录用户的登录信息。 返回值类型:元组 示例: 查看上一次登录认证通过的日期、时间和IP等信息: 1 2 3 4 5 SELECT * FROM login_audit_messages(true); username | database | logintime | type | result | client_conninfo | session_id ------------+----------+------------------------+---------------+--------+--------------------+----------------------------------------- dbadmin | gaussdb | 2017-06-02 15:28:34+08 | login_success | ok | gsql@[local] | 1663745305.140192538154752.coordinator1 (1 row) 查看上一次登录认证失败的日期、时间和IP等信息: 1 2 3 4 SELECT * FROM login_audit_messages(false) ORDER BY logintime desc limit 1; username | database | logintime | type | result | client_conninfo | session_id ------------+----------+------------------------+--------------+--------+-------------------------+------------ (0 rows) 查看自从最后一次认证通过以来失败的尝试次数、日期和时间: 1 2 3 4 SELECT * FROM login_audit_messages(false); username | database | logintime | type | result | client_conninfo | session_id ------------+----------+------------------------+--------------+--------+-------------------------+------------ (0 rows)
  • 操作步骤 获取词典定义文件和词缀文件。 用户可以使用开源词典,直接获取的开源词典后缀名可能为.aff和.dic,此时需要将扩展名改为.affix和.dict。此外,对于某些词典文件,还需要使用下面的命令把字符转换成UTF-8编码,比如挪威语词典: 1 2 iconv -f ISO_8859-1 -t UTF-8 -o nn_no.affix nn_NO.aff iconv -f ISO_8859-1 -t UTF-8 -o nn_no.dict nn_NO.dic 创建Ispell词典。 1 2 3 4 5 6 CREATE TEXT SEARCH DICTIONARY norwegian_ispell ( TEMPLATE = ispell, DictFile = nn_no, AffFile = nn_no, FilePath = 'obs://bucket01/obs.xxx.xxx.com accesskey=xxxxx secretkey=xxxxx region=cn-north-1' ); 其中,词典文件全名为nn_no.dict和nn_no.affix,所在目录为 'obs://bucket01/obs.xxx.xxx.com accesskey=xxxxx secretkey=xxxxx region=cn-north-1'。关于创建词典的语法和更多参数,请参见CREATE TEXT SEARCH DICTIONARY。 使用Ispell词典进行复合词拆分。 1 2 3 4 5 SELECT ts_lexize('norwegian_ispell', 'sjokoladefabrikk'); ts_lexize --------------------- {sjokolade,fabrikk} (1 row) MySpell不支持复合词,Hunspell对复合词有较好的支持。GaussDB(DWS)仅支持Hunspell中基本的复合词操作。通常情况下,Ispell词典能够识别的词是一个有限集合,其后应该配置一个更广义的词典,例如一个可以识别所有词的Snowball词典。
  • pg_terminate_backend(pid int) 描述:终止一个后台线程。 返回值类型:boolean 备注:如果成功,函数返回true,否则返回false。 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 SELECT pid FROM pg_stat_activity; pid ----------------- 140657876268816 140433774061312 140433587902208 140433656592128 140433723717376 140433637189376 140433552770816 140433481983744 140433349310208 (9 rows) SELECT pg_terminate_backend(140657876268816); pg_terminate_backend ---------------------- t (1 row)
  • pgxc_cancel_query(queryId int) 描述:取消当前集群下正在执行的查询。该函数8.1.2及以上版本支持。 返回值类型:boolean 备注:如果所有节点的查询均已取消,函数返回true,否则返回false。 示例: 1 2 3 4 5 6 7 8 9 10 11 12 SELECT query_id FROM pgxc_stat_activity WHERE stmt_type ='RESET'; query_id ---------- 0 0 (2 rows) SELECT pgxc_cancel_query(0); pgxc_cancel_query ------------------- f (1 row)
  • pgxc_terminate_query(queryId int) 描述:终止当前集群下正在执行的查询。该函数8.1.2及以上版本支持。 返回值类型:boolean 示例: 1 2 3 4 5 6 7 8 9 10 11 SELECT query_id FROM pgxc_stat_activity; query_id ----------------- 72339069014638631 (1 rows) SELECT pgxc_terminate_query(72339069014638631); pgxc_terminate_query ---------------------- t (1 row)
  • pg_wlm_jump_queue(pid int) 描述:调整任务到CN队列的最前端。 返回值类型:boolean 备注:如果成功,函数返回true,否则返回false。 示例: 1 2 3 4 5 6 7 8 9 10 11 SELECT pid FROM pg_stat_activity WHERE stmt_type ='RESET'; pid ----------------- 281471222065200 (1 row) SELECT pg_wlm_jump_queue(281471222065200); pg_wlm_jump_queue ------------------- t (1 row)
  • pg_cancel_query(queryId int) 描述:取消一个后端的当前查询。该函数8.1.2及以上版本支持。 返回值类型:boolean 备注:pg_cancel_query向由query_id标识的后端进程发送一个查询取消(SIGINT)信号。一个活动的后端进程的query_id可以从pg_stat_activity视图的query_id字段找到。 示例: 1 2 3 4 5 6 7 8 9 10 11 12 SELECT query_id FROM pgxc_stat_activity WHERE stmt_type ='RESET'; query_id ---------- 0 0 (2 rows) SELECT pg_cancel_query(0); pg_cancel_query ----------------- f (1 row)
  • pg_terminate_query(queryId int) 描述:终止一个后端的当前查询。该函数8.1.2及以上版本支持。 返回值类型:boolean 示例: 1 2 3 4 5 6 7 8 9 10 11 12 SELECT query_id FROM pgxc_stat_activity WHERE stmt_type ='RESET'; query_id ---------- 0 0 (2 rows) SELECT pg_terminate_query(0); pg_terminate_query -------------------- f (1 row)
  • pg_cancel_backend(pid int) 描述:取消一个后端的当前查询。 返回值类型:boolean 备注:pg_cancel_backend向由pid标识的后端进程发送一个查询取消(SIGINT)信号。一个活动的后端进程的PID可以从pg_stat_activity视图的pid字段找到,或者在服务器上用ps列出数据库进程。 示例: 1 2 3 4 5 6 7 8 9 10 11 SELECT pid FROM pg_stat_activity WHERE stmt_type ='RESET'; pid ----------------- 281471222065200 (1 row) SELECT pg_cancel_backend(281471222065200); pg_cancel_backend ------------------- t (1 row)
  • pg_rotate_logfile() 描述:滚动服务器的日志文件。 返回值类型:boolean 备注:pg_rotate_logfile通知日志文件管理器立即切换到一个新的输出文件。该函数仅在内置日志收集器运行时有效。 示例: 1 2 3 4 5 SELECT pg_rotate_logfile(); pg_rotate_logfile ------------------- t (1 row)
  • 参数说明 WITH [ RECURSIVE ] with_query [, ...] 用于声明一个或多个可以在主查询中通过名字引用的子查询,相当于临时表。 如果声明了RECURSIVE,那么允许SELECT子查询通过名字引用它自己。 其中with_query的详细格式为: with_query_name [ ( column_name [, ...] ) ] AS ( {select | values | insert | update | delete} ) – with_query_name指定子查询生成的结果集名字,在查询中可使用该名称访问子查询的结果集。 – column_name指定子查询结果集中显示的列名。 – 每个子查询可以是SELECT,VALUES,INSERT,UPDATE或DELETE语句。 plan_hint子句 以/*+ */的形式在关键字后,用于对指定语句块生成的计划进行hint调优,详细用法请参见使用Plan Hint进行调优。 IGNORE 用于主键或者唯一约束冲突时忽略冲突的数据。 详细介绍参见UPSERT。 OVERWRITE 用于标识覆盖式插入方式,使用此种插入方式执行结束后,目标原数据被清空,只存在新插入的数据。 OVERWRITE支持指定列插入的功能,其他列为默认值,若无默认值则为NULL。 OVERWRITE不要和INSERT INTO这类实时写入的操作并发,否则实时写入数据有被意外清理的风险。 OVERWRITE适用于大批量数据导入场景,不建议用于少量数据的插入场景。 避免对同一张表执行并发insert overwrite操作,否则会出现类似报错“tuple concurrently updated.”。 如果集群正在扩缩容,且INSERT OVERWRITE的写入表需要执行数据重分布,则INSERT OVERWRITE会清除当前数据,并自动将插入的数据按扩缩容后的节点来进行数据分布。如果INSERT OVERWRITE和该表的数据重分布过程同时执行,INSERT OVERWRITE会中断该表的数据重分布过程。 table_name 要插入数据的目标表名。 取值范围:已存在的表名。 AS 用于给目标表table_name指定别名。alias即为别名的名字。 column_name 目标表中的字段名: 字段名可以有子字段名或者数组下标修饰。 没有在字段列表中出现的每个字段,将由系统默认值,或者声明时的默认值填充,若都没有则用NULL填充。例如,向一个复合类型中的某些字段插入数据的话,其他字段将是NULL。 目标字段(column_name)可以按顺序排列。如果没有列出任何字段,则默认全部字段,且顺序为表声明时的顺序。 如果value子句和query中只提供了N个字段,则目标字段为前N个字段。 value子句和query提供的值在表中从左到右关联到对应列。 取值范围:已存在的字段名。 expression 赋予对应column的一个有效表达式或值: 向表中字段插入单引号 时需要使用单引号自身进行转义。 如果插入行的表达式不是正确的数据类型,系统试图进行类型转换,若转换不成功,则插入数据失败,系统返回错误信息。 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 CREATE TABLE tt01 (id int,content varchar(50)); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using round-robin as the distribution mode by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE INSERT INTO tt01 values (1,'Jack say ''hello'''); INSERT 0 1 INSERT INTO tt01 values (2,'Rose do 50%'); INSERT 0 1 INSERT INTO tt01 values (3,'Lilei say ''world'''); INSERT 0 1 INSERT INTO tt01 values (4,'Hanmei do 100%'); INSERT 0 1 SELECT * FROM tt01; id | content ----+------------------- 3 | Lilei say 'world' 4 | Hanmei do 100% 1 | Jack say 'hello' 2 | Rose do 50% (4 rows) DEFAULT 对应字段名的缺省值。如果没有缺省值,则为NULL。 query 一个查询语句(SELECT语句),将查询结果作为插入的数据。 ON DUPLICATE KEY 用于主键或者唯一约束冲突时更新冲突的数据。 duplicate_action指定更新列和更新的数据。 详细介绍参见UPSERT。 ON CONFLICT 用于主键或者唯一约束冲突时忽略或者更新冲突的数据。 conflict_target用于指定列名index_column_name 、包含多个列名的表达式index_expression 或者约束名字constraint_name。作用是用于从列名、包含多个列名的表达式或者约束名推断是否有唯一索引。其中index_column_name和index_expression遵循CREATE INDEX的索引列格式。 conflict_action 指定主键或者唯一约束冲突时执行的策略。有两种: DO NOTHING冲突忽略。 DO UPDATE SET冲突更新。 后面指定更新列和更新的数据。 详细介绍参见UPSERT。 RETURNING 返回实际插入的行,RETURNING列表的语法与SELECT的输出列表一致。 output_expression INSERT命令在每一行都被插入之后用于计算输出结果的表达式。 取值范围:该表达式可以使用table的任意字段。可以使用*返回被插入行的所有字段。 output_name 字段的输出名称。 取值范围:字符串,符合标识符命名规范。
  • 注意事项 只有拥有表INSERT权限的用户,才可以向表中插入数据。 如果使用RETURNING子句,用户必须要有该表的SELECT权限。 如果使用QUERY子句插入来自查询里的数据行,用户还需要拥有在查询里使用的表的SELECT权限。 如果使用OVERWRITE子句覆盖式插入数据,用户还需要拥有该表的SELECT和TRUNCATE权限。 当连接到TD兼容的数据库时,td_compatible_truncation参数设置为on时,将启用超长字符串自动截断功能,在后续的insert语句中(不包含外表的场景下),对目标表中char和varchar类型的列上插入超长字符串时,系统会自动按照目标表中相应列定义的最大长度对超长字符串进行截断。 如果向字符集为字节类型编码(SQL_ASCII,LATIN1等)的数据库中插入多字节字符数据(如汉字等),且字符数据跨越截断位置,这种情况下,按照字节长度自动截断,自动截断后会在尾部产生非预期结果。如果用户有对于截断结果正确性的要求,建议用户采用UTF8等能够按照字符截断的输入字符集作为数据库的编码集。
  • 语法格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 [ WITH [ RECURSIVE ] with_query [, ...] ] INSERT [/*+ plan_hint */] [ IGNORE | OVERWRITE ] INTO table_name [ AS alias ] [ ( column_name [, ...] ) ] { DEFAULT VALUES | VALUES {( { expression | DEFAULT } [, ...] ) }[, ...] | query } [ ON DUPLICATE KEY duplicate_action | ON CONFLICT [ conflict_target ] conflict_action ] [ RETURNING {* | {output_expression [ [ AS ] output_name ] }[, ...]} ]; and duplicate_action can be: UPDATE { column_name = { expression | DEFAULT } | ( column_name [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...] and conflict_target can be one of: ( { index_column_name | ( index_expression ) } [ COLLATE collation ] [ opclass ] [, ...] ) [ WHERE index_predicate ] ON CONSTRAINT constraint_name and conflict_action is one of: DO NOTHING DO UPDATE SET { column_name = { expression | DEFAULT } | ( column_name [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...] [ WHERE condition ]
  • 语法格式 1 2 3 4 CREATE REDACTION POLICY policy_name ON table_name [ { AFTER | BEFORE } old_policy_name ] [INHERIT] [ WHEN (when_expression) ] [ ADD COLUMN column_name WITH redaction_function_name ( [ argument [, ...] ] )] [, ... ];
  • 示例 对指定用户创建脱敏策略。 创建用户alice和matu: 1 2 CREATE ROLE alice PASSWORD '{password}'; CREATE ROLE matu PASSWORD '{password}'; 用户alice创建表对象emp并插入数据: 1 2 CREATE TABLE emp(id int, name varchar(20), salary NUMERIC(10,2)); INSERT INTO emp VALUES(1, 'July', 1230.10), (2, 'David', 999.99); 用户alice为表对象emp创建脱敏策略mask_emp,字段salary对用户matu不可见: 1 CREATE REDACTION POLICY mask_emp ON emp WHEN(current_user = 'matu') ADD COLUMN salary WITH mask_full(salary); 用户alice授予用户matu表emp的SELECT权限: 1 GRANT SELECT ON emp TO matu; 切至用户matu: 1 SET ROLE matu PASSWORD '{password}'; 查询表emp,字段salary数据已脱敏: 1 SELECT * FROM emp; 对角色创建脱敏策略。 创建角色redact_role: 1 CREATE ROLE redact_role PASSWORD '{password}'; 将用户matu,alice加入角色redact_role: 1 GRANT redact_role to matu,alice; 管理员用户创建表对象emp1并插入数据: 1 2 CREATE TABLE emp1(id int, name varchar(20), salary NUMERIC(10,2)); INSERT INTO emp1 VALUES(3, 'Rose', 2230.20), (4, 'Jack', 899.88); 管理员用户为表对象emp1创建脱敏策略mask_emp1,使字段salary对角色redact_role不可见。 1 CREATE REDACTION POLICY mask_emp1 ON emp1 WHEN(pg_has_role(current_user, 'redact_role', 'member')) ADD COLUMN salary WITH mask_full(salary); 若不指定用户,默认为当前用户current_user: 1 CREATE REDACTION POLICY mask_emp1 ON emp1 WHEN (pg_has_role('redact_role', 'member')) ADD COLUMN salary WITH mask_full(salary); 管理员用户授予用户matu表emp1的SELECT权限: 1 GRANT SELECT ON emp1 TO matu; 切换至用户matu: 1 SET ROLE matu PASSWORD '{password}'; 查询表emp,字段salary数据已脱敏。 1 SELECT * FROM emp1;
  • 注意事项 只有表对象的属主具有创建脱敏策略的权限。 仅支持在普通表创建数据脱敏策略,不支持为系统表、HDFS表、外表、临时表、UNLOGGED表以及视图和函数对象创建脱敏策略。 不支持通过同义词向普通表对象创建脱敏策略。 表对象与脱敏策略间一一对应。一个脱敏策略是表对象所有脱敏列的集合,可以给脱敏表对象的多个列字段指定脱敏函数,且不同脱敏列对象可以采用不同的脱敏函数。 创建脱敏策略时,默认策略生效,即属性enable值为true。 具有sysadmin权限的用户,可跳过脱敏策略检查,对脱敏列数据一直具有可见性,即脱敏策略不生效。 支持通过指定角色匹配脱敏策略。
  • 语法格式 1 2 3 4 VALUES {( expression [, ...] )} [, ...] [ ORDER BY { sort_expression [ ASC | DESC | USING operator ] } [, ...] ] [ { [ LIMIT { count | ALL } ] [ OFFSET start [ ROW | ROWS ] ] } | { LIMIT start, { count | ALL } } ] [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ];
  • 参数说明 expression 用于计算或插入结果表指定地点的常量或者表达式。 在一个出现在INSERT顶层的VALUES列表中,expression可以被DEFAULT替换以表示插入目的字段的缺省值。除此以外,当VALUES出现在其他场合的时候是不能使用DEFAULT的。 sort_expression 一个表示如何排序结果行的表达式或者整数常量。 ASC 指定按照升序排列。 DESC 指定按照降序排列。 operator 一个排序操作符。 count 返回的最大行数。 start 开始返回行之前忽略的行数。 FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY FETCH子句限定返回查询结果从第一行开始的总行数,count的缺省值为1。
  • generate_subscripts(array anyarray, dim int, reverse boolean) 描述:生成一系列包括给定数组的下标。当reverse为真时,该系列则以相反的顺序返回。 返回值类型:setof int 示例: 1 2 3 4 5 6 7 8 SELECT generate_subscripts('{NULL,1,NULL,2}'::int[], 1,TRUE) AS s; s --- 4 3 2 1 (4 rows)
  • 货币类型 货币类型存储带有固定小数精度的货币金额。表1中显示的范围假设有两位小数。可以以任意格式输入,包括整型、浮点型或者典型的货币格式(如“$1,000.00”)。根据区域字符集,输出一般是最后一种形式。 表1 货币类型 名字 存储容量 描述 范围 money 8 字节 货币金额 -92233720368547758.08 到 +92233720368547758.07 numeric,int和bigint类型的值可以转化为money类型。如果从real和double precision类型转换到money类型,可以先转化为numeric类型,再转化为money类型,例如: 1 SELECT '12.34'::float8::numeric::money; 这种用法是不推荐使用的。浮点数不应该用来处理货币类型,因为小数点的位数可能会导致错误。 money类型的值可以转换为numeric类型而不丢失精度。转换为其他类型可能丢失精度,并且必须通过以下两步来完成: 1 SELECT '52093.89'::money::numeric::float8; 当一个money类型的值除以另一个money类型的值时,结果是double precision(也就是,一个纯数字,而不是money类型);在运算过程中货币单位相互抵消。 父主题: 数据类型
  • 参数说明 statement 指定要分析的SQL语句。 ANALYZE boolean | ANALYSE boolean 显示实际运行时间和其他统计数据。 取值范围: TRUE(缺省值):显示实际运行时间和其他统计数据。 FALSE:不显示。 VERBOSE boolean 显示有关计划的额外信息。 取值范围: TRUE(缺省值):显示额外信息。 FALSE:不显示。 COSTS boolean 包括每个规划节点的估计总成本,以及估计的行数和每行的宽度。 取值范围: TRUE(缺省值):显示估计总成本和宽度。 FALSE:不显示。 CPU boolean 打印CPU的使用情况的信息。 取值范围: TRUE(缺省值):显示CPU的使用情况。 FALSE:不显示。 DETAIL boolean 打印DN上的信息。 取值范围: TRUE(缺省值):打印DN的信息。 FALSE:不打印。 8.2.1及以上集群版本支持explain打开Detail开关时,执行计划中会显示倾斜值比对耗时。 NODES boolean 打印query执行的节点信息。 取值范围: TRUE(缺省值):打印执行的节点的信息。 FALSE:不打印。 NUM_NODES boolean 打印执行中的节点的个数信息。 取值范围: TRUE(缺省值):打印DN个数的信息。 FALSE:不打印。 BUFFERS boolean 包括缓冲区的使用情况的信息。 取值范围: TRUE:显示缓冲区的使用情况。 FALSE(缺省值):不显示。 TIMING boolean 包括实际的启动时间和花费在输出节点上的时间信息。 取值范围: TRUE(缺省值):显示启动时间和花费在输出节点上的时间信息。 FALSE:不显示。 PLAN 是否将执行计划存储在plan_table中。当该选项开启时,会将执行计划存储在PLAN_TABLE中,不打印到当前屏幕,因此该选项为on时,不能与其他选项同时使用。 取值范围: ON(缺省值):将执行计划存储在plan_table中,不打印到当前屏幕。执行成功返回EXPLAIN SUCCESS。 OFF:不存储执行计划,将执行计划打印到当前屏幕。 FORMAT 指定输出格式。 取值范围:TEXT,XML,JSON和YAML。 默认值:TEXT PERFORMANCE 使用此选项时,即打印执行中的所有相关信息。 STATS boolean 打印复现SQL语句的执行计划所需的信息,包括对象定义、统计信息、配置参数等,通常用于定位问题。 取值范围: TRUE(缺省值):显示复现SQL语句的执行计划所需的信息。 FALSE:不显示。
共100000条