华为云用户手册

  • DB_COLL_TYPES DB_COLL_TYPES视图显示当前用户可访问的所有集合类型的信息。默认所有用户都可以访问。该视图同时存在于PG_CATA LOG 和SYS Schema下。 表1 DB_COLL_TYPES字段 名称 类型 描述 owner character varying(128) 集合的所有者。 type_name character varying(128) 集合的名称。 coll_type character varying(128) 集合的描述。 upper_bound numeric 暂不支持,值为NULL。 elem_type_mod character varying(7) 元素的类型修饰。 elem_type_owner character varying(128) 集合基于的元素类型的所有者。该值主要用于用户定义的类型。 elem_type_name character varying(128) 集合所依据的数据类型或用户定义类型的名称。 length numeric 暂不支持,值为NULL。 precision numeric 暂不支持,值为NULL。 scale numeric 暂不支持,值为NULL。 character_set_name character varying(44) 暂不支持,值为NULL。 elem_storage character varying(7) 暂不支持,值为NULL。 nulls_stored character varying(3) 暂不支持,值为NULL。 char_used character varying(1) 暂不支持,值为NULL。 父主题: 其他系统视图
  • GS_PACKAGE GS_PACKAGE系统表记录PACKAGE内的信息。 表1 GS_PACKAGE字段 名称 类型 描述 oid oid 行标识符(隐含属性,必须明确选择)。 pkgnamespace oid package所属schema。 pkgowner oid package的所属者。 pkgname name package的名字。 pkgspecsrc text package specification的内容。 pkgbodydeclsrc text package body的内容。 pkgbodyinitsrc text package init的内容。 pkgacl aclitem[] 访问权限。 pkgsecdef boolean package是否是定义者权限。 父主题: 其他系统表
  • GLOBAL_STATIO_SYS_TABLES GLOBAL_STATIO_SYS_TABLES视图显示各节点的命名空间中所有系统表的I/O状态信息,如表1所示。 表1 GLOBAL_STATIO_SYS_TABLES字段 名称 类型 描述 node_name name 节点名称。 relid oid 表OID。 schemaname name 该表模式名。 relname name 表名。 heap_blks_read bigint 从该表中读取的磁盘块数。 heap_blks_hit bigint 该表缓存命中数。 idx_blks_read bigint 从表中所有索引读取的磁盘块数。 idx_blks_hit bigint 表中所有索引命中缓存数。 toast_blks_read bigint 该表的TOAST表读取的磁盘块数(如果存在)。 toast_blks_hit bigint 该表的TOAST表命中缓冲区数(如果存在)。 tidx_blks_read bigint 该表的TOAST表索引读取的磁盘块数(如果存在)。 tidx_blks_hit bigint 该表的TOAST表索引命中缓冲区数(如果存在)。 父主题: Cache/IO
  • 示例 --创建并切换至测试数据库。 gaussdb=# CREATE DATABASE test_event WITH DBCOMPATIBILITY = 'b'; gaussdb=# \c test_event --创建表。 test_event=# CREATE TABLE t_ev(num int); --创建一个状态为DISABLE的定时任务,表示此定时任务不开启。 test_event=# CREATE EVENT IF NOT EXISTS event_e1 ON SCHEDULE AT sysdate + interval 5 second DISABLE DO insert into t_ev values(0); --查询定时任务,ENABLE值为'f'。 test_event=# SHOW EVENTS; job_name | schema_name | log_user | priv_user | job_status | start_date | interval | end_date | enable | failure_msg ----------+-------------+----------+-----------+------------+---------------------+----------+---------------------+--------+------------- event_e1 | public | omm | omm | s | 2023-11-28 09:10:58 | null | 3999-12-31 16:00:00 | f | (1 row) --修改定时任务状态为ENABLE,并五秒后查询表。 test_event=# ALTER EVENT event_e1 ENABLE; test_event=# SELECT * FROM t_ev; num ----- 0 (1 row) --创建一个每隔一分钟执行一次的定时任务。 test_event=# CREATE EVENT IF NOT EXISTS event_e2 ON SCHEDULE EVERY 1 minute DO insert into t_ev values(1); --每隔一分钟查询表,会看到新增一条数据。 test_event=# SELECT * FROM t_ev; num ----- 0 1 1 (3 rows) --修改定时任务中待执行语句并查询表。 test_event=# ALTER EVENT event_e2 DO insert into t_ev values(3); test_event=# SELECT * FROM t_ev; num ----- 0 1 1 3 (4 rows) --修改定时任务名称。 test_event=# ALTER EVENT event_e2 RENAME TO event_ee; --删除定时任务。 test_event=# DROP EVENT event_ee; --删除表。 test_event=# DROP TABLE t_ev; --切换回初始数据库,并删除测试数据库。请用真实的数据库名替换postgres。 test_event=# \c postgres gaussdb=# DROP DATABASE test_event;
  • 注意事项 定时任务相关操作只有sql_compatibility = 'B'时支持。 只有定时任务的所有者有权修改对应的定时任务,系统管理员默认拥有修改所有定时任务的权限。 可以通过SHOW EVENTS或在PG_JOB表中查看log_user列来获得job的所有者信息。 每次修改定时任务成功后,会更新被修改job的所有者为当前用户,若修改定时任务时指定了definer,则更新为被指定的definer。 definer选项场景限制与CREATE EVENT章节中对definer限制场景一致。 系统管理员修改其他用户创建的定时任务后,被修改定时任务的所有者将切换为系统管理员,待执行语句将使用系统管理员的权限执行。
  • 语法格式 ALTER [DEFINER = user] EVENT event_name [ON SCHEDULE schedule] [ON COMPLETION [NOT] PRESERVE] [RENAME TO new_event_name] [ENABLE | DISABLE | DISABLE ON SLAVE] [COMMENT 'string'] [DO event_body]; schedule: 1 2 3 4 5 6 { AT timestamp [+ INTERVAL interval] ... | EVERY interval [STARTS timestamp [+ INTERVAL interval] ...] [ENDS timestamp [+ INTERVAL interval] ...] } interval: quantity {YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | YEAR TO MONTH | DAY TO HOUR | DAY TO MINUTE | DAY TO SECOND | HOUR TO MINUTE | HOUR TO SECOND | MINUTE TO SECOND}
  • 参数说明 DEFINER 定时任务待执行语句在执行时使用的权限。默认情况下使用当前创建定时任务者的权限,当definer被指定时,使用被指定用户user的用户权限。 definer参数只有具有sysadmin权限的用户有权指定。 ON SCHEDULE 定时任务执行时刻。其中schedule子句与CREATE EVENT中schedule一致。 RENAME TO 更新定时任务名。 ON COMPLETION [NOT] PRESERVE 默认情况下,一旦事务处于完成状态,系统表中就会立刻删除该定时任务。用户可以通过设置ON COMPLETION PRESERVE来覆盖默认行为。 ENABLE | DISABLE | DISABLE ON SLAVE 创建定时任务后,定时任务默认处于ENABLE状态,即到规定时间立即执行待执行语句。用户可以使用DISABLE关键字,改变定时任务的活动状态。DISABLE ON SLAVE表现与DISABLE一致。 COMMENT 用户可以给定时任务添加注释,注释内容在GS_JOB_ATTRIBUTE表中查看。 DO 定时任务待执行语句。 interval 时间间隔。interval的取值可以使用下划线代替TO。例如,YEAR_MONTH、DAY_HOUR等。 该参数在B兼容模式下,GUC参数b_format_version = '5.7'、b_format_dev_version = 's1'时才可使用。
  • 注意事项 序列的所有者或者被授予了序列ALTER权限的用户或者被授予了ALTER ANY SEQUENCE权限的用户才能执行ALTER SEQUENCE命令,三权分立开关关闭时,系统管理员默认拥有该权限。但要修改序列的所有者,当前用户必须是该序列的所有者或者系统管理员,且该用户是新所有者角色的成员。 当前版本仅支持修改拥有者、归属列、最大值和cache缓存值。若要修改其他参数,可以删除重建,并用Setval函数恢复当前值。 ALTER SEQUENCE MAXVALUE不支持在事务、函数和存储过程中使用。 修改序列的最大值后,会清空该序列在所有会话的cache。 如果Sequence被创建时使用了LARGE标识,则ALTER时也需要使用LARGE标识。 ALTER SEQUENCE会阻塞nextval、setval、currval和lastval的调用。
  • 语法格式 修改序列最大值、归属列和缓存值。 ALTER [ LARGE ] SEQUENCE [ IF EXISTS ] name [MAXVALUE maxvalue | NO MAXVALUE | NOMAXVALUE | CACHE cache] [ OWNED BY { table_name.column_name | NONE } ] ; 修改序列的拥有者。 ALTER [ LARGE ] SEQUENCE [ IF EXISTS ] name OWNER TO new_owner;
  • 参数说明 name 将要修改的序列名称。 IF EXISTS 当序列不存在时使用该选项,不会显示ERROR,而是返回一个NOTICE信息。 MAXVALUE maxvalue | NO MAXVALUE | NOMAXVALUE 执行序列的最大值。新修改的最大值必须大于当前的last_value;如果没有指定,将保持旧的最大值。 取值范围:(last_value, 263-1] ,使用LARGE标识时则为(last_value, 2127-1]。 CACHE 为了快速访问,而在内存中预先存储序列号的个数。如果没有指定,将保持旧的缓冲值。 取值范围:[1, 2^63-1] ,使用LARGE标识时则为:[1, 2127-1]。 OWNED BY 将序列和一个表的指定字段进行关联。这样,在删除该字段或其所在表的时候会自动删除已关联的序列。 如果序列已经和表有关联后,使用这个选项后新的关联关系会覆盖旧的关联。 关联的表和序列的所有者必须是同一个用户,并且在同一个模式中。 使用OWNED BY NONE将删除任何已经存在的关联。 new_owner 序列新所有者的用户名。用户要修改序列的所有者,必须是新角色的直接或者间接成员,并且该角色必须有序列所在模式上的CREATE权限。
  • 示例 --创建一个名为serial的递增序列,从101开始。 gaussdb=# CREATE SEQUENCE serial START 101; --创建一个表,定义默认值。 gaussdb=# CREATE TABLE t1(c1 bigint default nextval('serial')); --将序列serial的归属列变为t1.c1。 gaussdb=# ALTER SEQUENCE serial OWNED BY t1.c1; --删除序列和表。 gaussdb=# DROP SEQUENCE serial CASCADE; gaussdb=# DROP TABLE t1; --创建一个序列seq_test。 gaussdb=# CREATE SEQUENCE seq_test; --查询序列信息。 gaussdb=# \ds List of relations Schema | Name | Type | Owner | Storage --------+----------+----------+-------+--------- public | seq_test | sequence | omm | (1 row) --创建用户u_test并修改序列所有者。 gaussdb=# CREATE USER u_test PASSWORD '********'; gaussdb=# ALTER SEQUENCE seq_test OWNER TO u_test; gaussdb=# \ds List of relations Schema | Name | Type | Owner | Storage --------+----------+----------+--------+--------- public | seq_test | sequence | u_test | (1 row) --删除用户和序列。 gaussdb=# DROP SEQUENCE seq_test; gaussdb=# DROP USER u_test;
  • 选择数据类型 在字段设计时,基于查询效率的考虑,一般需要遵循以下原则: 尽量使用高效数据类型。 选择数值类型时,在满足业务精度的情况下,选择数据类型的优先级从高到低依次为整数、浮点数、NUMERIC。 当多个表存在逻辑关系时,表示同一含义的字段应该使用相同的数据类型。 对于字符串数据,建议使用变长字符串数据类型,并指定最大长度。请务必确保指定的最大长度大于需要存储的最大字符数,避免出现超出字段定义最大长度的异常报错而导致业务中断现象。除非明确知道数据类型为固定长度字符串,否则,不建议使用CHAR(n)、BPCHAR(n)、NCHAR(n)、CHARACTER(n)。 关于字符串类型的详细说明,请参见常用字符串类型介绍。
  • 注意事项 当参数enable_copy_server_files关闭时,只允许初始用户执行COPY FROM FILENAME或COPY TO FILENAME命令,当参数enable_copy_server_files打开时,允许具有SYSADMIN权限的用户或继承了内置角色gs_role_copy_files权限的用户执行,但默认禁止对数据库配置文件,密钥文件,证书文件和审计日志执行COPY FROM FILENAME或COPY TO FILENAME,以防止用户越权查看或修改敏感文件。同时enable_copy_server_files打开时,管理员可以通过guc参数safe_data_path设置普通用户可以导入导出的路径必须为设置路径的子路径,未设置此guc参数时候(默认情况),不对普通用户使用的路径进行拦截。该参数会对copy使用路径中的相对路径进行报错处理。在多租场景下,仅有初始用户可在PDB内部执行COPY FROM FILENAME或COPY TO FILENAME命令。 COPY只能用于表,不能用于视图。 COPY TO需要读取的表的SELECT权限,COPY FROM需要插入的表的INSERT权限。 如果声明了一个字段列表,COPY将只在文件和表之间复制已声明字段的数据。如果表中有任何不在字段列表里的字段,COPY FROM将为那些字段插入缺省值。 如果声明了数据源文件,服务器必须可以访问该文件;如果指定了STDIN,数据将在客户前端和服务器之间流动,输入时,表的列与列之间使用TAB键分隔,在新的一行中以反斜杠和句点(\.)表示输入结束。 如果数据文件的任意行包含比预期多或者少的字段,COPY FROM将抛出一个错误。 数据的结束可以用一个只包含反斜杠和句点(\.)的行表示。如果从文件中读取数据,数据结束的标记是不必要的;如果在客户端应用之间复制数据,必须要有结束标记。 COPY FROM中\N为空字符串,如果要输入实际数据值\N ,使用\\N。
  • 语法格式 从一个文件复制数据到一个表。 COPY [BINARY] table_name [ ( column_name [, ...] ) ] [ WITH OIDS ] FROM { 'filename' | STDIN } [ LOAD ] [ LOAD_DISCARD 'discard_file_name' ] [ LOAD_BAD 'bad_file_name' ] [ USEEOF ] [ [ USING ] DELIMITERS 'delimiters' ] [ WITHOUT ESCAPING ] [ LOG ERRORS | LOG ERRORS DATA ] [ REJECT LIMIT 'limit' ] [ WITH ] [ copy_option [ ...] | ( option [, ...] ) ]; 把一个表的数据复制到一个文件。 COPY table_name [ ( column_name [, ...] ) ] [ WITH OIDS ] TO { 'filename' | STDOUT } [ [ USING ] DELIMITERS 'delimiters' ] [ WITHOUT ESCAPING ] [ WITH ] [ copy_option [ ...] | ( option [, ...] ) ]; COPY query {(SELECT) | (VALUES)} TO { 'filename' | STDOUT } [ WITHOUT ESCAPING ] [ WITH ] [ copy_option [ ...] | ( option [, ...] ) ]; COPY TO语法形式约束如下: (query)与[USING] DELIMITERS不兼容,即若COPY TO的数据来自于一个query的查询结果,那么COPY TO语法不能再指定[USING] DELIMITERS语法子句。 copy_option是指COPY原生的参数形式,而option是兼容外表导入的参数形式。 FILLER/SEQUENCE/CONSTANT参数仅在copy_option字句中支持。如果在option字句中传入,会被忽略。 其中可选参数copy_option子句语法为: OIDS | DELIMITER [ AS ] 'delimiter_string' | NULL [ AS ] 'null_string' | HEADER | FILEHEADER 'header_file_string' | FREEZE | FORCE NOT NULL column_name [, ...] | FORCE QUOTE { column_name [, ...] | * } | BINARY | CS V | FIXED | QUOTE [ AS ] 'quote_character' | ESCAPE [ AS ] 'escape_character' | EOL 'newline_character' | ENCODING 'encoding_name' | IGNORE_EXTRA_DATA | FILL_MISSING_FIELDS [ { 'one' | 'multi' } ] | COMPATIBLE_ILLEGAL_CHARS | DATE_FORMAT 'date_format_string' | TIME_FORMAT 'time_format_string' | TIMESTAMP_FORMAT 'timestamp_format_string' | DATEA_FORMAT 'datea_format_string' | SMALLDATETIME_FORMAT 'smalldatetime_format_string' | SKIP int_number | WHEN { { ( start - end ) | column_name } { = | != } 'string' [ AND ...] } | SEQUENCE ( { column_name ( integer [, incr] ) [, ...] } ) | FILLER ( { column_name [, ...] } ) | CONSTANT ( { column_name 'constant_string' [, ...] } ) | COPY_CUSTOM_ID 'custom_id_string' | TABLE_COMPRESS_CLAUSE( ROW STORE COMPRESS ADVANCED [ MEDIUM | HIGH ] ROW [ON (EXPR)]) | FORMATTER ( [ column_name( offset, length ) ] [, ...] ) | TRANSFORM ( [ column_name [ data_type ] [ AS transform_expr ] ] [, ...] ) | STARTS begin_line_number | LIMIT limit_line_number | ROWS commit_row_number 其中可选参数option子句语法为: FORMAT 'format_name' | OIDS [ boolean ] | DELIMITER 'delimiter_character' | NULL 'null_string' | HEADER [ boolean ] | USEEOF [ boolean ] | FILEHEADER 'header_file_string' | FREEZE [ boolean ] | QUOTE 'quote_character' | ESCAPE 'escape_character' | EOL 'newline_character' | NOESCAPING [ boolean ] | FORCE_QUOTE { ( column_name [, ...] ) | * } | FORCE_NOT_NULL ( column_name [, ...] ) | ENCODING 'encoding_name' | IGNORE_EXTRA_DATA [ boolean ] | FILL_MISSING_FIELDS [ boolean ] | COMPATIBLE_ILLEGAL_CHARS [ boolean ] | DATE_FORMAT 'date_format_string' | TIME_FORMAT 'time_format_string' | TIMESTAMP_FORMAT 'timestamp_format_string' | DATEA_FORMAT 'datea_format_string' | SMALLDATETIME_FORMAT 'smalldatetime_format_string' | SKIP int_number | COPY_CUSTOM_ID 'custom_id_string' | BEGIN_LINE_NO begin_line_number | LIMIT limit_line_number | ROWS commit_row_number
  • 示例 --创建源表及触发表。 gaussdb=# CREATE TABLE test_trigger_src_tbl(id1 INT, id2 INT, id3 INT); gaussdb=# CREATE TABLE test_trigger_des_tbl(id1 INT, id2 INT, id3 INT); INSERT触发器的使用。 --创建insert触发器函数。 gaussdb=# CREATE OR REPLACE FUNCTION tri_insert_func() RETURNS TRIGGER AS $$ DECLARE BEGIN INSERT INTO test_trigger_des_tbl VALUES(NEW.id1, NEW.id2, NEW.id3); RETURN NEW; END $$ LANGUAGE plpgsql; --创建INSERT触发器。 gaussdb=# CREATE TRIGGER insert_trigger BEFORE INSERT ON test_trigger_src_tbl FOR EACH ROW EXECUTE PROCEDURE tri_insert_func(); --执行INSERT触发事件并检查触发结果。 gaussdb=# INSERT INTO test_trigger_src_tbl VALUES(100,200,300); gaussdb=# SELECT * FROM test_trigger_src_tbl; id1 | id2 | id3 -----+-----+----- 100 | 200 | 300 (1 row) gaussdb=# SELECT * FROM test_trigger_des_tbl; //查看触发操作是否生效。 id1 | id2 | id3 -----+-----+----- 100 | 200 | 300 (1 row) UPDATE触发器的使用。 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 27 28 29 30 --创建UPDATE触发器函数。 gaussdb=# CREATE OR REPLACE FUNCTION tri_update_func() RETURNS TRIGGER AS $$ DECLARE BEGIN UPDATE test_trigger_des_tbl SET id3 = NEW.id3 WHERE id1=OLD.id1; RETURN OLD; END $$ LANGUAGE plpgsql; --创建UPDATE触发器。 gaussdb=# CREATE TRIGGER update_trigger AFTER UPDATE ON test_trigger_src_tbl FOR EACH ROW EXECUTE PROCEDURE tri_update_func(); --执行UPDATE触发事件并检查触发结果。 gaussdb=# UPDATE test_trigger_src_tbl SET id3=400 WHERE id1=100; gaussdb=# SELECT * FROM test_trigger_src_tbl; id1 | id2 | id3 -----+-----+----- 100 | 200 | 400 (1 row) gaussdb=# SELECT * FROM test_trigger_des_tbl; //查看触发操作是否生效。 id1 | id2 | id3 -----+-----+----- 100 | 200 | 400 (1 row) DELETE触发器的使用。 --创建DELETE触发器函数。 gaussdb=# CREATE OR REPLACE FUNCTION TRI_DELETE_FUNC() RETURNS TRIGGER AS $$ DECLARE BEGIN DELETE FROM test_trigger_des_tbl WHERE id1=OLD.id1; RETURN OLD; END $$ LANGUAGE plpgsql; --创建DELETE触发器。 gaussdb=# CREATE TRIGGER delete_trigger BEFORE DELETE ON test_trigger_src_tbl FOR EACH ROW EXECUTE PROCEDURE tri_delete_func(); --执行DELETE触发事件并检查触发结果。 gaussdb=# DELETE FROM test_trigger_src_tbl WHERE id1=100; gaussdb=# SELECT * FROM test_trigger_src_tbl; id1 | id2 | id3 -----+-----+----- (0 rows) gaussdb=# SELECT * FROM test_trigger_des_tbl; //查看触发操作是否生效。 id1 | id2 | id3 -----+-----+----- (0 rows) 修改触发器名称。 1 2 --修改触发器的名称。 gaussdb=# ALTER TRIGGER delete_trigger ON test_trigger_src_tbl RENAME TO delete_trigger_renamed; 禁用触发器。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 --禁用insert_trigger触发器。 gaussdb=# ALTER TABLE test_trigger_src_tbl DISABLE TRIGGER insert_trigger; gaussdb=# INSERT INTO test_trigger_src_tbl VALUES(100,200,300); gaussdb=# SELECT * FROM test_trigger_src_tbl; id1 | id2 | id3 -----+-----+----- 100 | 200 | 300 (1 row) gaussdb=# SELECT * FROM test_trigger_des_tbl; //可以看到触发器没有生效。 id1 | id2 | id3 -----+-----+----- (0 rows) --禁用当前表上所有触发器。 gaussdb=# ALTER TABLE test_trigger_src_tbl DISABLE TRIGGER ALL; 删除触发器。 1 2 3 4 5 gaussdb=# DROP TRIGGER insert_trigger ON test_trigger_src_tbl; gaussdb=# DROP TRIGGER update_trigger ON test_trigger_src_tbl; gaussdb=# DROP TRIGGER delete_trigger_renamed ON test_trigger_src_tbl; 删除函数。 1 2 3 4 5 gaussdb=# DROP FUNCTION tri_insert_func; gaussdb=# DROP FUNCTION tri_update_func; gaussdb=# DROP FUNCTION tri_delete_func; 1 2 3 --删除源表及触发表。 gaussdb=# DROP TABLE test_trigger_src_tbl; gaussdb=# DROP TABLE test_trigger_des_tbl;
  • 语法格式 1 2 3 4 5 6 7 CREATE [OR REPLACE] [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] } ON table_name [ FROM referenced_table_name ] { NOT DEFERRABLE | [ DEFERRABLE ] { INITIALLY IMMEDIATE | INITIALLY DEFERRED } } [ FOR [ EACH ] { ROW | STATEMENT } ] [ WHEN ( condition ) ] [ EXECUTE PROCEDURE function_name ( arguments ) | AnonyBlock ]; 其中event包含以下几种: 1 INSERT 1 UPDATE [ OF column_name [, ... ] ] 1 DELETE 1 TRUNCATE
  • 参数说明 OR REPLACE 可选项,指定此参数将在TRIGGER已存在的前提下修改已有的TRIGGER。 无法通过OR REPLACE语法创建或修改CONSTRAINT TRIGGER和INTERNAL TRIGGER。CONSTRAINT TRIGGER是指通过CREATE CONSTRAINT TRIGGER创建的TRIGGER,INTERNAL TRIGGER是指某些SQL语句隐式创建的TRIGGER(如给表加上外键约束会隐式创建4个trigger,这4个TRIGGER即为INTERNAL TRIGGER)。 CONSTRAINT 可选项,指定此参数将创建约束触发器,即触发器作为约束来使用。除了可以使用SET CONSTRAINTS调整触发器触发的时间之外,这与常规触发器相同。 约束触发器必须是AFTER ROW触发器。 name 触发器名称,该名称不能限定模式,因为触发器自动继承其所在表的模式,且同一个表的触发器不能重名。 对于约束触发器,使用SET CONSTRAINTS修改触发器行为时也使用此名称。 取值范围:符合标识符命名规范的字符串,且最大长度不超过63个字符。 BEFORE 触发器函数是在触发事件发生前执行。 AFTER 触发器函数是在触发事件发生后执行,约束触发器只能指定为AFTER。 INSTEAD OF 触发器函数直接替代触发事件。 event 启动触发器的事件,取值范围包括:INSERT、UPDATE、DELETE或TRUNCATE,也可以通过OR同时指定多个触发事件。 对于UPDATE事件类型,可以使用下面语法指定列: UPDATE OF column_name1 [, column_name2 ... ] 表示只有这些列作为UPDATE语句的目标列时,才会启动触发器,但是INSTEAD OF UPDATE类型不支持指定列信息。如果UPDATE OF指定的列包含生成列,当生成列依赖的列是UPDATE语句的目标列时,也会启动触发器。 table_name 需要创建触发器的表名称。 取值范围:数据库中已经存在的表名称。 referenced_table_name 约束引用的另一个表的名称。 只能为约束触发器指定,常见于外键约束。由于当前不支持外键,因此不建议使用。 取值范围:数据库中已经存在的表名称。 DEFERRABLE | NOT DEFERRABLE 约束触发器的启动时机,仅作用于约束触发器。这两个关键字设置该约束是否可推迟。 详细介绍请参见CREATE TABLE。 INITIALLY IMMEDIATE | INITIALLY DEFERRED 如果约束是可推迟的,则这个子句声明检查约束的缺省时间,仅作用于约束触发器。 详细介绍请参见CREATE TABLE。 FOR EACH ROW | FOR EACH STATEMENT 触发器的触发频率。 FOR EACH ROW是指该触发器是受触发事件影响的每一行触发一次。 FOR EACH STATEMENT是指该触发器是每个SQL语句只触发一次。 未指定时默认值为FOR EACH STATEMENT。约束触发器只能指定为FOR EACH ROW。 condition 决定是否实际执行触发器函数的条件表达式。当指定WHEN时,只有在条件返回true时才会调用该函数。 在FOR EACH ROW触发器中,WHEN条件可以通过分别写入OLD.column_name或NEW.column_name来引用旧行或新行值的列。INSERT触发器不能引用OLD,DELETE触发器不能引用NEW。 INSTEAD OF触发器不支持WHEN条件。 WHEN表达式不能包含子查询。 对于约束触发器,WHEN条件的评估不会延迟,而是在执行更新操作后立即发生。 如果条件返回值不为true,则触发器不会排队等待延迟执行。 function_name 用户定义的函数,必须声明为不带参数并返回类型为触发器,在触发器触发时执行。 arguments 执行触发器时要提供给函数的可选的以逗号分隔的参数列表。参数是文字字符串常量,简单的名称和数字常量也可以写在这里,但它们都将被转换为字符串。 请检查触发器函数的实现语言的描述,以了解如何在函数内访问这些参数。 关于触发器种类: INSTEAD OF的触发器必须标记为FOR EACH ROW,并且只能在视图上定义。 BEFORE和AFTER触发器作用在视图上时,只能标记为FOR EACH STATEMENT。 TRUNCATE类型触发器仅限FOR EACH STATEMENT。 表1 表和视图上支持的触发器种类: 触发时机 触发事件 行级 语句级 BEFORE INSERT/UPDATE/DELETE 表 表和视图 TRUNCATE 不支持 表 AFTER INSERT/UPDATE/DELETE 表 表和视图 TRUNCATE 不支持 表 INSTEAD OF INSERT/UPDATE/DELETE 视图 不支持 TRUNCATE 不支持 不支持 表2 plpgsql类型触发器函数特殊变量: 变量名 变量含义 NEW INSERT及UPDATE操作涉及tuple信息中的新值,对DELETE为空,并且对于statement级别的触发器此变量也为空。 OLD UPDATE及DELETE操作涉及tuple信息中的旧值,对INSERT为空,并且对于statement级别的触发器此变量也为空。 TG_NAME 触发器名称。 TG_WHEN 触发器触发时机(BEFORE/AFTER/INSTEAD OF)。 TG_LEVEL 触发频率(ROW/STATEMENT)。 TG_OP 触发操作(INSERT/UPDATE/DELETE/TRUNCATE)。 TG_RELID 触发器所在表OID。 TG_RELNAME 触发器所在表名(已废弃,现用TG_TABLE_NAME替代)。 TG_TABLE_NAME 触发器所在表名。 TG_TABLE_SCHEMA 触发器所在表的SCHEMA信息。 TG_NARGS 触发器函数参数个数。 TG_ARGV[] 触发器函数参数列表。
  • 注意事项 当前仅支持在普通行存表上创建触发器,不支持在临时表、unlogged表等类型表上创建触发器。 如果为同一事件定义了多个相同类型的触发器,则按触发器的名称字母顺序触发它们。 触发器常用于多表间数据关联同步场景,对SQL执行性能影响较大,不建议在大数据量同步及对性能要求高的场景中使用。 当触发器满足如下条件时,触发语句能和触发器一起下推到DN执行并提升触发器执行性能: GUC参数enable_trigger_shipping和enable_fast_query_shipping开启。 源表触发器使用的触发器函数为plpgsql类型(推荐类型)。 源表与触发表分布键的类型、数量完全相同,均为行存表,且所属相同的NODEGROUP。 原INSERT/UPDATE/DELETE语句条件中包含所有分布键与NEW/OLD等值比较表达式。 原INSERT/UPDATE/DELETE语句在没有触发器的情况下就能query shipping。 源表上只有BEFORE INSERT FOR EACH ROW、AFTER INSERT FOR EACH ROW、BEFORE UPDATE FOR EACH ROW、AFTER UPDATE FOR EACH ROW、BEFORE DELETE FOR EACH ROW、AFTER DELETE FOR EACH ROW六类触发器,且所有触发器都可下推。 执行触发器语句时是通过触发器创建者的身份进行权限判断的。 执行创建触发器操作的用户需要拥有指定表的TRIGGER权限或被授予了CREATE ANY TRIGGER权限。 BEFORE触发的行级触发器函数可以返回一个NULL值,表示忽略对该行的操作,之后的触发器将不再执行,并且不会对该行产生INSERT/UPDATE/DELETE动作。 AFTER触发器函数返回值无影响。 BEFORE DELETE的情况下,触发器函数返回值NEW等于NULL。BEFORE INSERT的情况下,触发器函数返回值OLD等于NULL。BEFORE UPDATE的情况下,触发器函数返回值只有显示为NULL才是NULL值。 对于event为INSERT/UPDATE的触发器函数,正常返回值是NEW。如果返回一个非NULL的行,将修改插入或者更新的行。对于event为DELETE的触发器函数,正常返回值是OLD。 INSTEAD OF触发器只能作用于视图,其触发器函数同样可以返回NULL值,表示随后的触发器将不再执行。
  • 系统表和系统视图概述 系统表是 GaussDB 存放结构元数据的地方,它是 GaussDB数据库 系统运行控制信息的来源,是数据库系统的核心组成部分。 系统视图提供了查询系统表和访问数据库内部状态的方法。 系统表和系统视图要么只对管理员可见,要么对所有用户可见。下面的系统表和视图有些标识了需要管理员权限,这些系统表和视图只有管理员可以查询。 用户可以删除后重新创建这些表、增加列、插入和更新数值,但是用户修改系统表会导致系统信息的不一致,从而导致系统控制紊乱。正常情况下不应该由用户手工修改系统表或系统视图,或者手工重命名系统表或系统视图所在的模式,而是由SQL语句关联的系统表操作自动维护系统表信息。 不建议用户修改系统表和系统视图的权限。 用户应该禁止对系统表进行增删改等操作,人为对系统表的修改或破坏可能会导致系统各种异常情况甚至集群不可用。 系统表和系统视图中与外键相关的字段暂不支持。 系统表和系统视图中的字段类型详见数据类型章节介绍。 对于ADM类视图,由于访问到的对象是数据库下所有的该类型的对象,考虑对ADM类视图进行统一权限管理,默认只有系统管理员有权限访问该类型视图,部分ADM类的视图数据来自基表中公开、非敏感的字段;对于DB类视图,查询到的是数据库内当前用户有权限访问的对象,普通用户即可访问该类视图;对于MY类视图,查询到的是当前用户所属的对象,普通用户即可访问该类视图。 父主题: 系统表和系统视图
  • 示例 --建表并插入数 gaussdb=# CREATE TABLE test1(c11 INT, c12 VARCHAR); gaussdb=# INSERT INTO test1 VALUES (1,'a'),(2,'b'),(4,'d'); gaussdb=# CREATE TABLE test2(c21 INT, c22 VARCHAR); gaussdb=# INSERT INTO test2 VALUES (1,'a'),(3,'c'); UNION gaussdb=# SELECT * FROM test1 UNION SELECT * FROM test2; c11 | c12 -----+----- 1 | a 4 | d 2 | b 3 | c (4 rows) UNION ALL gaussdb=# SELECT * FROM test1 UNION ALL SELECT * FROM test2; c11 | c12 -----+----- 1 | a 2 | b 4 | d 1 | a 3 | c (5 rows) INTERSECT gaussdb=# SELECT * FROM test1 INTERSECT SELECT * FROM test2; c11 | c12 -----+----- 1 | a (1 row) MINUS gaussdb=# SELECT * FROM test1 MINUS SELECT * FROM test2; c11 | c12 -----+----- 4 | d 2 | b (2 rows) -- 删除。 gaussdb=# DROP TABLE test1,test2;
  • 示例 --创建表reason_t1。 gaussdb=# CREATE TABLE reason_t1( r_reason_sk integer, r_reason_id character(16), r_reason_desc character(100) ) WITH(STORAGE_TYPE = ustore); --创建表reason_t2。 gaussdb=# CREATE TABLE reason_t2( r_reason_sk integer, r_reason_id character(16), r_reason_desc character(100) ) WITH(STORAGE_TYPE = ustore); -- 对表reason_t1和reason_t2添加索引。 gaussdb=# CREATE INDEX idx_t1 on reason_t1(r_reason_id); gaussdb=# CREATE INDEX idx_t2 on reason_t2(r_reason_id); gaussdb=# DROP TABLE reason_t1; gaussdb=# DROP TABLE reason_t2; --查看回收站。 gaussdb=# SELECT rcyname,rcyoriginname,rcytablespace FROM GS_RECYCLEBIN; rcyname | rcyoriginname | rcytablespace ----------------------------+---------------+--------------- BIN$31C94EB4207$8001$0==$0 | reason_t1 | 0 BIN$31C94EB420D$8001$0==$0 | idx_t1 | 0 BIN$31C94EB420A$8004$0==$0 | reason_t2 | 0 BIN$31C94EB420E$8004$0==$0 | idx_t2 | 0 (4 rows) --PURGE清除表。 gaussdb=# PURGE TABLE reason_t1; gaussdb=# SELECT rcyname,rcyoriginname,rcytablespace FROM GS_RECYCLEBIN; rcyname | rcyoriginname | rcytablespace ----------------------------+---------------+--------------- BIN$31C94EB420A$8004$0==$0 | reason_t2 | 0 BIN$31C94EB420E$8004$0==$0 | idx_t2 | 0 (2 rows) --PURG清除索引。 gaussdb=# PURGE INDEX idx_t2; gaussdb=# SELECT rcyname,rcyoriginname,rcytablespace FROM GS_RECYCLEBIN; rcyname | rcyoriginname | rcytablespace ----------------------------+---------------+--------------- BIN$31C94EB420A$8004$0==$0 | reason_t2 | 0 (1 row) --PURGE清除回收站所有对象。 gaussdb=# PURGE recyclebin; gaussdb=# SELECT rcyname,rcyoriginname,rcytablespace FROM GS_RECYCLEBIN; rcyname | rcyoriginname | rcytablespace -----------------------+---------------+--------------- (0 rows)
  • unix_socket_group 参数说明:设置Unix域套接字的所属组(套接字的所属用户总是启动服务器的用户)。可以与选项unix_socket_permissions一起用于对套接字进行访问控制。 参数类型:字符串 参数单位:无 取值范围:系统中已有的用户组。 默认值:"",表示当前用户的缺省组。 设置方式:该参数属于POSTMASTER类型参数,请参见表1中对应设置方法进行设置。 设置建议:推荐使用默认值。 设置不当的风险与影响:请在充分理解参数含义,并经过测试验证后进行修改。
  • unix_socket_directory 参数说明:设置GaussDB服务器侦听客户端连接的Unix域套接字目录,仅sysadmin用户可以访问。 参数类型:字符串 参数单位:无 取值范围:合法目录路径。 该参数的取值长度限制于操作系统的最大目录路径长度,Linux系统下,套接字路径名(套接字目录与套接字文件名拼接而成)长度不得超过107bytes,目录最长不得超过92bytes。超过该限制将会导致Unix-domain socket path "xxx" is too long的问题。 默认值:""(实际值由安装时配置文件中tmpMppdbPath指定) 设置方式:该参数属于POSTMASTER类型参数,请参见表1中对应设置方法进行设置。 设置建议:推荐使用默认值。 设置不当的风险与影响:若误设置出错(包括长度超过限制、非法目录等),会影响进程正常拉起,可以通过检索cm_agent路径下system_call日志定界。
  • application_name 参数说明:当前连接请求当中,所使用的客户端名称。 参数类型:字符串 参数单位:无 取值范围:合法的客户端名称,实际查询结果取决于查询所用的客户端或用户设置。 在备机请求主机进行日志复制时,如果该参数非空串,那么会被用来作为备机在主机上的流复制槽名字。此时,如果该参数长度超过61个字节,那么流复制槽名字只会截取使用前61个字节的字符。 默认值:""(连接到后端的应用名,以实际安装为准)。 设置方式:该参数属于USERSET类型参数,请参见表1中对应设置方法进行设置。但是需要注意的是,客户端连接后该参数会被设为客户端名称,且设置为客户端级别,所以只有设置会话级别的参数会生效,其他方式都由于级别低于客户端级别而不会生效。 设置建议:推荐使用默认值。 设置不当的风险与影响:数据库依赖于application_name标识部分内部进程,当用户设置了与内部进程同名的application_name时,可能产生非预期的行为。
  • unix_socket_permissions 参数说明:设置Unix域套接字的访问权限。 Unix域套接字使用普通的Unix文件系统权限集。这个参数的值应该是数值的格式(chmod和umask命令可接受的格式)。如果使用自定义的八进制格式,数字必须以0开头。 参数类型:整型 参数单位:无 取值范围:0000 ~ 0777 在Linux中,文档具有十个属性,其中第一个属性为文档类型,后面九个为权限属性,分别为Owner,Group及Others这三个组别的read、write、execute属性。 文档的权限属性分别简写为r,w,x,这九个属性三个为一组,也可以使用数字来表示文档的权限,对照表如下: r:4 w: 2 x:1 -:0 同一组(owner/group/others)的三个属性是累加的。 例如,-rwxrwx---表示这个文档的权限为: owner = rwx = 4+2+1 = 7 group = rwx = 4+2+1 = 7 others = --- = 0+0+0 = 0 所以其权限为0770。 默认值:0700 设置方式:该参数属于POSTMASTER类型参数,请参见表1中对应设置方法进行设置。 设置建议:建议设置为0770(只有当前连接数据库的用户和同组的人可以访问)或者0700(只有当前连接数据库的用户自己可以访问,同组或者其他人都没有权限)。 设置不当的风险与影响:请在充分理解参数含义,并经过测试验证后进行修改。
  • extip_reserved_connections 参数说明:为用户在listen_address_ext配置的扩展IP上进行的普通gsql业务连接预留的最少连接数。该参数和max_connections参数配合使用,对应业务连接的最大连接数等于max_connections + service_reserved_connections。 该参数仅在为分布式DN配置了listen_address_ext的具体IP地址时有效。 参数类型:整型 参数单位:无 取值范围:最小值为0,最大值为MIN(262143, max_connections),max_connections的计算方法见max_connections。 默认值:5 设置方式:该参数属于POSTMASTER类型参数,请参见表1中对应设置方法进行设置。 设置建议:推荐使用默认值。 设置不当的风险与影响:请在充分理解参数含义,并经过测试验证后进行修改。
  • check_disconnect_query 参数说明:该参数控制的是,当客户端异常断连(如JDBC触发socketTimeout、libpq触发rwtimeout且关闭连接、运行业务过程中客户端进程终止等)后,GaussDB服务端语句是否终止执行。 参数类型:布尔型 参数单位:无 取值范围: on:表示当客户端异常断连后,GaussDB服务端终止运行对应的语句。 off:表示当客户端异常断连后,GaussDB服务端不会终止运行对应的语句。 默认值:on 设置方式:该参数属于POSTMASTER类型参数,请参见表1中对应设置方法进行设置。 设置建议:推荐使用默认值。 设置不当的风险与影响:请在充分理解参数含义,并经过测试验证后进行修改。
  • service_reserved_connections 参数说明:为后台运维用户(带有persistence属性)预留的最少连接数,不建议设置过大。该参数和max_connections参数配合使用,运维用户的最大连接数等于max_connections + service_reserved_connections。 参数类型:整型 参数单位:无 取值范围:0 ~ 262143 默认值:10 设置方式:该参数属于POSTMASTER类型参数,请参见表1中对应设置方法进行设置。 设置建议:推荐使用默认值。 设置不当的风险与影响:如果设置过小,会导致在max_connections占满的情况下,运维用户(带有persistence属性)无法连接数据库,作业无法正常执行。如果设置过大,则会有过多的空闲资源。
  • connection_reject_nodes 参数说明:用于表示CN/DN中拒绝接受其他CN连接的黑名单,用逗号进行分隔,例如'cn_5001,cn_5002'。当黑名单中的CN(如cn_5001)连接至本节点时,会拒绝接受其连接,并报错“Reject cn_5001 connection”。 参数类型:字符串 参数单位:无 取值范围:由若干个节点名称和英文逗号组成的字符串。 默认值:"" 设置方式:该参数属于SIGHUP类型参数,请参见表1中对应设置方法进行设置。 设置建议:推荐使用默认值。 设置不当的风险与影响:当设置为节点名时,其他节点会拒接接受其连接,造成连接报错。
  • local_bind_address 参数说明:声明当前节点连接集群其他节点绑定的本地IP地址。 参数类型:字符串 参数单位:无 取值范围:IPv4或IPv6格式地址,不支持多IP设置。 默认值: 集群安装好后,根据public_cloud.conf配置文件中不同实例的IP地址配置不同默认值。CN/DN的默认参数值为:“data.net网卡对应的IP地址”。 public_cloud.conf文件保存的网卡信息,包括:mgr.net(管理网卡)、data.net(数据网卡)、virtual.net(虚拟网卡)。 设置方式:该参数属于POSTMASTER类型参数,请参见表1中对应设置方法进行设置。 设置建议:推荐使用默认值。 设置不当的风险与影响:该参数由安装时的配置文件指定,请勿轻易修改,否则修改后会影响数据库正常通信。
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全