华为云用户手册

  • byteawithoutorderwithequalcolne(byteawithoutorderwithequalcol, byteawithoutorderwithequalcol) 描述:比较两个byteawithoutorderwithequalcol类型的数据是否不相同,不相同则返回true,否则返回false。 参数类型:byteawithoutorderwithequalcol, byteawithoutorderwithequalcol 返回值类型:bool
  • tee_nlike(byteawithoutorderwithequalcol, byteawithoutorderwithequalcol) 描述:byteawithoutorderwithequalcol数据之间是否不符合模糊匹配关系,如果是则返回true,否则返回false。不支持直接使用该函数。 参数类型:byteawithoutorderwithequalcol, byteawithoutorderwithequalcol 返回值类型:bool
  • ce_encrypt_deterministic(int2, oid) 描述:将int2类型的明文 数据加密 至密态等值结构的密文,密钥oid为系统表gs_column_keys中的column_key_distributed_id。若入参为NULL值,将会直接返回NULL值。 参数类型:int2, oid 备注:只在开启内存解密逃生通道时使用。 返回值类型:byteawithoutorderwithequalcol
  • byteawithoutorderwithequalcolcmpbyteal(bytea, byteawithoutorderwithequalcol) 描述:比较bytea和byteawithoutorderwithequalcol数据大小,若第一个参数小于第二个参数,返回-1;若等于,返回0;若大于,则返回1。 参数类型:bytea, byteawithoutorderwithequalcol 返回值类型:int4
  • ce_encrypt_deterministic(int1, oid) 描述:将int1类型的明文数据加密至密态等值结构的密文,密钥oid为系统表gs_column_keys中的column_key_distributed_id。若入参为NULL值,将会直接返回NULL值。 参数类型:int1, oid 备注:只在开启内存解密逃生通道时使用。 返回值类型:byteawithoutorderwithequalcol
  • ce_encrypt_deterministic(float4, oid) 描述:将float4类型的明文数据加密至密态等值结构的密文,密钥oid为系统表gs_column_keys中的column_key_distributed_id。若入参为NULL值,将会直接返回NULL值。 参数类型:float4, oid 备注:只在开启内存解密逃生通道时使用。 返回值类型:byteawithoutorderwithequalcol
  • ce_encrypt_deterministic(numeric, oid) 描述:将numeric类型的明文数据加密至密态等值结构的密文,密钥oid为系统表gs_column_keys中的column_key_distributed_id。若入参为NULL值,将会直接返回NULL值。 参数类型:numeric, oid 备注:只在开启内存解密逃生通道时使用。 返回值类型:byteawithoutorderwithequalcol
  • ce_encrypt_deterministic(clob, oid) 描述:将clob类型的明文数据加密至密态等值结构的密文,密钥oid为系统表gs_column_keys中的column_key_distributed_id。若入参为NULL值,将会直接返回NULL值。 参数类型:clob, oid 备注:只在开启内存解密逃生通道时使用。 返回值类型:byteawithoutorderwithequalcol
  • 示例 byteawithoutorderwithequalcolin、byteawithoutorderwithequalcolout等密态等值函数为数据库内核中数据类型byteawithoutorderwithequalcol指定的in、out、send、recv等读写格式转换函数,具体可参考bytea类型的byteain、byteaout等函数,但会对本地的cek进行验证,需要密文字段中有本地存在的cekoid才能执行成功。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 -- 例如存在加密表int_type,int_col2为其加密列。 -- 使用非密态客户端连接数据库,查询加密列密文。 gaussdb=# SELECT int_col2 FROM int_type; int_col2 ------------------------------------------------------------------------------------------------------------------------------------------------------ \x01c35301bf421c8edf38c34704bcc82838742917778ccb402a1b7452ad4a6ac7371acc0ac33100000035fe3424919854c86194f1aa5bb4e1ca656e8fc6d05324a1419b69f488bdc3c6 (1 row) -- 将加密列密文当做byteawithoutorderwithequalcolin入参,格式从cstring输入转码转化成内部byteawithoutorderwithequalcol形式。 gaussdb=# SELECT byteawithoutorderwithequalcolin('\x01c35301bf421c8edf38c34704bcc82838742917778ccb402a1b7452ad4a6ac7371acc0ac33100000035fe3424919854c86194f1aa5bb4e1ca656e8fc6d05324a1419b69f488bdc3c6'); byteawithoutorderwithequalcolin ------------------------------------------------------------------------------------------------------------------------------------------------------ \x01c35301bf421c8edf38c34704bcc82838742917778ccb402a1b7452ad4a6ac7371acc0ac33100000035fe3424919854c86194f1aa5bb4e1ca656e8fc6d05324a1419b69f488bdc3c6 (1 row) 由于byteawithoutorderwithequalcolin等的实现会对cek进行查找,并且判断是否为正常加密后的数据类型。 因此如果输入数据的格式不是加密后的数据格式,并且在本地不存在对应cek的情况下,会返回错误。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 gaussdb=# SELECT * FROM byteawithoutorderwithequalcolsend('\x907219912381298461289346129'::byteawithoutorderwithequalcol); ERROR: cek with OID 596711794 not found LINE 1: SELECT * FROM byteawithoutorderwithequalcolsend('\x907219912... ^ gaussdb=# SELECT * FROM byteawithoutordercolout('\x90721901999999999999912381298461289346129'); ERROR: cek with OID 2566986098 not found LINE 1: SELECT * FROM byteawithoutordercolout('\x9072190199999999999... gaussdb=# SELECT * FROM byteawithoutorderwithequalcolrecv('\x90721901999999999999912381298461289346129'::byteawithoutorderwithequalcol); ERROR: cek with OID 2566986098 not found ^ gaussdb=# SELECT * FROM byteawithoutorderwithequalcolsend('\x90721901999999999999912381298461289346129'::byteawithoutorderwithequalcol); ERROR: cek with OID 2566986098 not found LINE 1: SELECT * FROM byteawithoutorderwithequalcolsend('\x907219019... ^
  • byteawithoutorderwithequalcolcmpbytear(byteawithoutorderwithequalcol, bytea) 描述:比较byteawithoutorderwithequalcol和bytea数据大小,若第一个参数小于第二个参数,返回-1;若等于,返回0;若大于,则返回1。 参数类型:byteawithoutorderwithequalcol, bytea 返回值类型:int4
  • tee_collect(byteawithoutorderwithequalcol, byteawithoutorderwithequalcol) 描述:密文聚合运算内部处理函数。不支持用户调用。 参数类型:byteawithoutorderwithequalcol, byteawithoutorderwithequalcol 返回值类型:byteawithoutorderwithequalcol
  • ce_encrypt_deterministic(bytea, oid) 描述:将bytea类型的明文数据加密至密态等值结构的密文,密钥oid为系统表gs_column_keys中的column_key_distributed_id。若入参为NULL值,将会直接返回NULL值。 参数类型:bytea, oid 备注:只在开启内存解密逃生通道时使用。 返回值类型:byteawithoutorderwithequalcol
  • GS_ LOG ICAL_PARTITION GS_LOGICAL_PARTITION系统表存储分区表相关的信息。 表1 GS_LOGICAL_PARTITION字段 字段名称 字段类型 说明 partitionid Oid 分区表OID。 relname name 分区表的名称。 parttype char 分区类型。 parentid oid 父表OID。 relfilenode oid 分区表relfilenode。 reltoastrelid oid TOAST 表的OID。 reltoastidxid oid TOAST索引的OID。 csnmin bigint 插入元组时的 CS N(提交序列号)。 csnmax bigint 更新或删除元组时的 CSN。 originid integer 元组的来源标识符。 createtime timestamp with time zone 插入元组的时间戳。 reltablespace oid 表空间的OID。 dbnode oid 数据库OID。 父主题: 逻辑解码
  • 模式级字符集和字符序 创建模式并指定默认字符集和字符序,创建模式请参见CREATE SCHEMA。 CREATE SCHEMA schema_name [ [DEFAULT] CHARACTER SET | CHARSET [ = ] default_charset ] [ [DEFAULT] COLLATE [ = ] default_collation ]; 修改模式的默认字符集、字符序属性,修改模式请参见ALTER SCHEMA。 ALTER SCHEMA schema_name [ [DEFAULT] CHARACTER SET | CHARSET [ = ] default_charset ] [ [DEFAULT] COLLATE [ = ] default_collation ]; 语法说明: schema_name 模式名称。 取值范围:字符串,要符合标识符的命名规范。 default_charset 指定模式的默认字符集,单独指定时会将模式的默认字符序设置为指定的字符集的默认字符序。 default_collation 指定模式的默认字符序,单独指定时会将模式的默认字符集设置为指定的字符序对应的字符集。 GaussDB 通过以下方式选择模式的字符集和字符序: 如果同时指定了default_charset和default_collation,则使用字符集default_charset和字符序default_collation ,且default_charset和 default_collation需要对应,不对应会产生报错。 如果仅指定了default_charset ,则使用字符集default_charset及其默认字符序。 如果仅指定了default_collation ,则使用default_collation字符序和其对应的字符集。 如果既不指定default_charset也不指定default_collation ,则该模式没有默认字符集和默认字符序。 default_charset仅支持指定为带有默认字符序的字符集,如果指定的字符集没有默认字符序则报错。 default_collation仅支持指定为B模式(即sql_compatibility = 'B')下的字符序,指定其他字符序报错。 暂不支持创建新SCHEMA的字符集与数据库的server_encoding不同。 示例: 1 2 3 4 5 6 7 8 9 10 11 -- 仅设置字符集,字符序为字符集的默认字符序。 gaussdb=# CREATE SCHEMA test CHARSET utf8; -- 仅设置字符序,字符集为字符序关联的字符集。 gaussdb=# CREATE SCHEMA test COLLATE utf8_bin; -- 同时设置字符集与字符序,字符集和字符序需对应。 gaussdb=# CREATE SCHEMA test CHARSET utf8 COLLATE utf8_bin; -- 将test的默认字符集修改为utf8mb4,默认字符序修改为utf8mb4_bin。 gaussdb=# ALTER SCHEMA test CHARSET utf8mb4 COLLATE utf8mb4_bin; 父主题: 字符集与字符序
  • GLOBAL_STAT_USER_TABLES 显示数据库各节点所有Schema中用户自定义普通表的状态信息(不汇总),如表1所示。 表1 GLOBAL_STAT_USER_TABLES字段 名称 类型 描述 node_name name 节点名称。 relid oid 表的OID。 schemaname name 此表所在的Schema名。 relname name 表名。 seq_scan bigint 此表发起的顺序扫描数。 seq_tup_read bigint 顺序扫描抓取的活跃行数。 idx_scan bigint 此表发起的索引扫描数。 idx_tup_fetch bigint 索引扫描抓取的活跃行数。 n_tup_ins bigint 插入行数。 n_tup_upd bigint 更新行数。 n_tup_del bigint 删除行数。 n_tup_hot_upd bigint HOT更新行数(即没有更新索引列的行数)。 n_live_tup bigint 估计活跃行数。 n_dead_tup bigint 估计不活跃行数。在Ustore表中仅代表不活跃行指针数量。 last_vacuum timestamp with time zone 最后一次此表是手动清理的(不计算VACUUM FULL)时间。 last_autovacuum timestamp with time zone 上次被autovacuum守护线程清理的时间。 last_analyze timestamp with time zone 上次手动分析此表的时间。 last_autoanalyze timestamp with time zone 上次被autovacuum守护线程分析的时间。 vacuum_count bigint 此表被手动清理的次数(不计算VACUUM FULL)。 autovacuum_count bigint 此表被autovacuum清理的次数。 analyze_count bigint 此表被手动分析的次数。 autoanalyze_count bigint 此表被autovacuum守护线程分析的次数。 父主题: Object
  • GLOBAL_PLANCACHE_STATUS GLOBAL_PLANCACHE_STATUS视图显示GPC全局计划缓存状态信息,如表1所示。多租不支持。 表1 GLOBAL_PLANCACHE_STATUS字段 名称 类型 描述 nodename text 所属节点名称。 query text 查询语句text。 refcount integer 被引用次数。 valid bool 是否合法。 databaseid oid 所属数据库id。 schema_name text 所属schema。 params_num integer 参数数量。 func_id oid 该plancache所在存储过程oid,如果不属于存储过程则为0。 pkg_id oid 该plancache所在存储过程所属的Package,如果不属于Package则为0。 stmt_id integer 显示存储过程内语句计划的序号。 父主题: Global Plancache
  • 示例 对表进行聚簇排序: 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 --建表并向表中插入数据。 gaussdb=# CREATE TABLE test_c1(id int, name varchar(20)); gaussdb=# CREATE INDEX idx_test_c1_id ON test_c1(id); gaussdb=# INSERT INTO test_c1 VALUES (3,'Joe'),(1,'Jack'),(2,'Scott'); --查看。 gaussdb=# SELECT * FROM test_c1; id | name ----+------- 3 | Joe 1 | Jack 2 | Scott (3 rows) --聚簇排序。 gaussdb=# CLUSTER test_c1 USING idx_test_c1_id; --查看。 gaussdb=# SELECT * FROM test_c1; id | name ----+------- 1 | Jack 2 | Scott 3 | Joe (3 rows) --删除。 gaussdb=# DROP TABLE test_c1; 对已做过聚簇的表重新进行聚簇排序: --建表。 gaussdb=# CREATE TABLE test(col1 int,CONSTRAINT pk_test PRIMARY KEY (col1)); --第一次聚簇排序不带USING关键字报错。 gaussdb=# CLUSTER test; ERROR: there is no previously clustered index for table "test" --聚簇排序。 gaussdb=# CLUSTER test USING pk_test; --插入数据。 gaussdb=# INSERT INTO test VALUES (1),(99),(10),(8); --对已做过聚簇的表重新进行聚簇。 gaussdb=# CLUSTER VERBOSE test; INFO: clustering "public.test" using index scan on "pk_test"(dn_6001 pid=3672) INFO: "test": found 0 removable, 4 nonremovable row versions in 1 pages(dn_6001 pid=3672) DETAIL: 0 dead row versions cannot be removed yet. CPU 0.00s/0.00u sec elapsed 0.01 sec. CLUSTER --删除。 gaussdb=# DROP TABLE test; 对分区进行聚簇排序: --建表并向表中插入数据。 gaussdb=# CREATE TABLE test_c2(id int, info varchar(4)) PARTITION BY RANGE (id)( PARTITION p1 VALUES LESS THAN (11), PARTITION p2 VALUES LESS THAN (21) ); gaussdb=# CREATE INDEX idx_test_c2_id1 ON test_c2(id); gaussdb=# INSERT INTO test_c2 VALUES (6,'ABBB'),(2,'ABAB'),(9,'AAAA'); gaussdb=# INSERT INTO test_c2 VALUES (11,'AAAB'),(19,'BBBA'),(16,'BABA'); --查看。 gaussdb=# SELECT * FROM test_c2; id | info ----+------ 6 | ABBB 2 | ABAB 9 | AAAA 11 | AAAB 19 | BBBA 16 | BABA (6 rows) --对分区p2进行聚簇排序。 gaussdb=# CLUSTER test_c2 PARTITION (p2) USING idx_test_c2_id1; --查看。 gaussdb=# SELECT * FROM test_c2; id | info ----+------ 6 | ABBB 2 | ABAB 9 | AAAA 11 | AAAB 16 | BABA 19 | BBBA (6 rows) --删除。 gaussdb=# DROP TABLE test_c2;
  • 注意事项 只有行存B-tree索引支持CLUSTER操作。 如果用户只是随机访问表中的行,那么表中数据的实际存储顺序是无关紧要的。但是,如果对某些特定数据的访问次数较多,而且有一个索引将这些数据分组,那么使用CLUSTER索引对性能会有所提升。 如果一个请求从表中查找的索引是一个范围,或者是一个索引值对应多行,CLUSTER也会有助于应用,因为如果索引标识出了第一匹配行所在的存储页,所有其它行也可能也已经在同一个存储页里了,这样便节省了磁盘访问的时间,加速了查询。 在聚簇过程中,系统会先创建一个按照索引顺序建立的表的临时备份,同时也建立表上的每个索引的临时备份。因此,聚簇过程中需要保证磁盘上有足够的剩余空间,至少是表大小与全部索引大小之和。 因为CLUSTER记录着哪些索引曾被用于聚簇,所以用户可以在第一次手动指定索引,对指定表进行聚簇,然后设置一个周期化执行的维护脚本,只需执行不带参数的CLUSTER命令,就可以实现对想要周期性聚簇的表进行自动更新。 因为优化器记录着有关表的排序的统计,在表上执行聚簇操作后,需运行ANALYZE操作以确保优化器具备最新的排序信息,否则,优化器可能会选择非最优的查询规划。 CLUSTER不允许在事务中执行。 如果没有将GUC参数xc_maintenance_mode设置为on,那么CLUSTER操作将跳过所有系统表。
  • 功能描述 根据一个索引对表进行聚簇排序。 CLUSTER指定GaussDB通过索引名指定的索引聚簇由表名指定的表。表名上必须已经定义该索引。 当对一个表聚簇后,该表将基于索引信息进行物理存储。聚簇是一次性操作:当表被更新之后,更改的内容不会被聚簇。也就是说,系统不会试图按照索引顺序对新的存储内容及更新记录进行重新聚簇。 在对一个表聚簇之后,GaussDB会记录该表在哪一个索引上建立了聚簇。CLUSTER table_name将在该表之前记录过的聚簇索引上重新聚簇。用户也可以用ALTER TABLE table_name CLUSTER on index_name来设置指定表用于后续聚簇操作的索引,或使用ALTER TABLE table_name SET WITHOUT CLUSTER来清除指定表之前设置的聚簇索引。 不含参数的CLUSTER命令会将当前用户所拥有的数据库中的先前做过聚簇的所有表重新处理。如果系统管理员调用这个命令,则对所有进行过聚簇的表重新聚簇。 在对一个表进行聚簇的时候,会在其上请求一个AC CES S EXCLUSIVE锁,这样就避免了在CLUSTER操作完成之前对该表执行其它的操作(包括读写)。
  • 参数说明 VERBOSE 可选。启用显示进度信息。 table_name 表名称。 取值范围:已存在的表名称。 [ USING index_name ] 索引名称。 取值范围:已存在的索引名称。 第一次对表进行聚簇排序时必须指定index_name,后续再次对表进行聚簇排序时不指定index_name,将会按照已有记录对表进行聚簇排序。 partition_name 分区名称。 取值范围:已存在的分区名称。
  • 语法格式 对一个表进行聚簇排序。 CLUSTER [ VERBOSE ] table_name [ USING index_name ]; 对一个分区进行聚簇排序。 CLUSTER [ VERBOSE ] table_name PARTITION ( partition_name ) [ USING index_name ]; 对已做过聚簇的表重新进行聚簇。 CLUSTER [ VERBOSE ];
  • 窗口函数查询 窗口函数对数据集中的相关行集执行计算,返回一个结果集。 与聚合函数所完成的计算相比,窗口函数并不会使多行被聚集成一个单独的输出行。 --建表并插入数据。 gaussdb=# CREATE TABLE fruit_sale ( "statistical_date" date, "product" varchar(255), "year" varchar(5), "sales_quantity" numeric(8), "amount" numeric(8) ); gaussdb=# INSERT INTO fruit_sale VALUES ('2024-01-01', '西瓜', '2024', 1721, 253541); gaussdb=# INSERT INTO fruit_sale VALUES ('2024-01-01', '苹果', '2024', 5559, 269419); gaussdb=# INSERT INTO fruit_sale VALUES ('2024-02-01', '西瓜', '2024', 4711, 129644); --统计所有水果的销售量。 gaussdb=# SELECT *,SUM(sales_quantity) OVER (PARTITION by null) total_qty FROM fruit_sale; statistical_date | product | year | sales_quantity | amount | total_qty ------------------+---------+------+----------------+--------+----------- 2024-01-01 | 西瓜 | 2024 | 1721 | 253541 | 11991 2024-01-01 | 苹果 | 2024 | 5559 | 269419 | 11991 2024-02-01 | 西瓜 | 2024 | 4711 | 129644 | 11991 (3 rows) --删除。 gaussdb=# DROP TABLE fruit_sale; 父主题: SELECT
  • ADM_DEPENDENCIES ADM_DEPENDENCIES视图显示数据库中的类型、表、视图、存储过程、函数、触发器之间的依赖关系。默认只有系统管理员权限才可以访问,普通用户需要授权才可以访问。该视图同时存在于PG_CATALOG和SYS Schema下。 表1 ADM_DEPENDENCIES字段 名称 类型 描述 owner name 对象的所有者。 name name 对象的名称。 type character varying(18) 对象的类型。 referenced_owner name 被引用对象的所有者。 referenced_name name 被引用对象的名称。 referenced_type character varying(18) 被引用对象的类型。 referenced_link_name character varying(128) 暂不支持,值为NULL。 dependency_type character varying(4) 暂不支持,值为NULL。 父主题: 其他系统视图
  • 参数说明 plan_hint子句 以/*+ */的形式在MERGE关键字后,用于对MERGE对应的语句块生成的计划进行hint调优,详细用法请参见章节使用Plan Hint进行调优。每条语句中只有第一个/*+ plan_hint */注释块会作为hint生效,里面可以写多条hint。 INTO子句 指定正在更新或插入的目标表。 table_name 目标表的表名。 partition_clause 指定分区MERGE操作。 关键字详见SELECT一节介绍。 如果value子句的值和指定分区不一致,会抛出异常。 示例详见CREATE TABLE SUBPARTITION。 alias 目标表的别名。 取值范围:字符串,符合标识符命名规范。 USING子句 指定源表,源表可以为表、视图或子查询。 ON子句 关联条件,用于指定目标表和源表的关联条件。不支持更新关联条件中的字段。 WHEN MATCHED子句 当源表和目标表中数据针对关联条件可以匹配上时,选择WHEN MATCHED子句进行UPDATE操作。 不支持更新系统表、系统列。 WHEN NOT MATCHED子句 当源表和目标表中数据针对关联条件无法匹配时,选择WHEN NOT MATCHED子句进行INSERT操作。 不支持INSERT子句中包含多个VALUES。 WHEN MATCHED和WHEN NOT MATCHED子句顺序可以交换,可以缺省其中一个,但不能同时缺省,不支持同时指定两个WHEN MATCHED或WHEN NOT MATCHED子句。 DEFAULT 用对应字段的缺省值填充该字段。 如果没有缺省值,则为NULL。 WHERE condition UPDATE子句和INSERT子句的条件,只有在条件满足时才进行更新操作,可缺省。不支持WHERE条件中引用系统列。不建议使用int等数值类型作为condition,因为int等数值类型可以隐式转换为bool值(非0值隐式转换为true,0转换为false),可能导致非预期的结果。
  • 语法格式 MERGE [/*+ plan_hint */] INTO table_name [ partition_clause ] [ [ AS ] alias ] USING { { table_name | view_name } | subquery } [ [ AS ] alias ] ON ( condition ) [ WHEN MATCHED THEN UPDATE SET { column_name = { expression | subquery | DEFAULT } | ( column_name [, ...] ) = ( { expression | subquery | DEFAULT } [, ...] ) } [, ...] [ WHERE condition ] ] [ WHEN NOT MATCHED THEN INSERT { DEFAULT VALUES | [ ( column_name [, ...] ) ] VALUES ( { expression | subquery | DEFAULT } [, ...] ) [, ...] [ WHERE condition ] } ];
  • 示例 -- 创建目标表products和源表newproducts,并插入数据 gaussdb=# CREATE TABLE products ( product_id INTEGER, product_name VARCHAR2(60), category VARCHAR2(60) ); gaussdb=# INSERT INTO products VALUES (1501, 'vivitar 35mm', 'electrncs'); gaussdb=# INSERT INTO products VALUES (1502, 'olympus is50', 'electrncs'); gaussdb=# INSERT INTO products VALUES (1600, 'play gym', 'toys'); gaussdb=# INSERT INTO products VALUES (1601, 'lamaze', 'toys'); gaussdb=# INSERT INTO products VALUES (1666, 'harry potter', 'dvd'); gaussdb=# CREATE TABLE newproducts ( product_id INTEGER, product_name VARCHAR2(60), category VARCHAR2(60) ); gaussdb=# INSERT INTO newproducts VALUES (1502, 'olympus camera', 'electrncs'); gaussdb=# INSERT INTO newproducts VALUES (1601, 'lamaze', 'toys'); gaussdb=# INSERT INTO newproducts VALUES (1666, 'harry potter', 'toys'); gaussdb=# INSERT INTO newproducts VALUES (1700, 'wait interface', 'books'); -- 进行MERGE INTO操作 gaussdb=# MERGE INTO products p USING newproducts np ON (p.product_id = np.product_id) WHEN MATCHED THEN UPDATE SET p.product_name = np.product_name, p.category = np.category WHERE p.product_name != 'play gym' WHEN NOT MATCHED THEN INSERT VALUES (np.product_id, np.product_name, np.category) WHERE np.category = 'books'; MERGE 4 -- 查询更新后的结果 gaussdb=# SELECT * FROM products ORDER BY product_id; product_id | product_name | category ------------+----------------+----------- 1501 | vivitar 35mm | electrncs 1502 | olympus camera | electrncs 1600 | play gym | toys 1601 | lamaze | toys 1666 | harry potter | toys 1700 | wait interface | books (6 rows) -- 删除表 gaussdb=# DROP TABLE products; gaussdb=# DROP TABLE newproducts;
  • 删除Schema 具体操作请参见DROP SCHEMA。 当Schema为空时,即该Schema下没有数据库对象,使用DROP SCHEMA命令进行删除。例如删除名为nullschema的空Schema。 1 2 gaussdb=# DROP SCHEMA IF EXISTS nullschema; DROP SCHEMA 当Schema非空时,如果要删除一个Schema及其包含的所有对象,需要使用CASCADE关键字。例如删除myschema及该Schema下的所有对象。 1 2 gaussdb=# DROP SCHEMA myschema CASCADE; DROP SCHEMA 删除Schema后,需删除用户,可执行如下命令删除用户jack。 1 2 gaussdb=# DROP USER jack; DROP ROLE
  • Schema的权限控制 默认情况下,用户仅能访问其拥有的Schema内的数据库对象。若要访问其他Schema中的对象,需由目标Schema所有者授予对应USAGE权限。 通过将模式的CREATE权限授予某用户,被授权用户就可以在此模式中创建对象。默认情况下,所有角色都拥有在public模式上的usage权限,但是普通用户没有在public模式上的CREATE权限。普通用户具备连接指定数据库并在其public模式中创建对象的权限时,将产生安全风险。若已授予普通用户public模式的CREATE权限,建议执行以下语句撤销该权限。 撤销PUBLIC在public模式下创建对象的权限,下面语句中第一个“public”指的是模式,第二个“PUBLIC”指系统预定义的所有用户角色。 1 2 gaussdb=# REVOKE CREATE ON SCHEMA public FROM PUBLIC; REVOKE 执行如下命令查看当前Schema。 1 2 3 4 5 gaussdb=# SELECT current_schema(); current_schema ---------------- myschema (1 row) 执行如下命令创建用户jack,并将myschema的usage权限授予用户jack。 1 2 3 4 gaussdb=# CREATE USER jack IDENTIFIED BY '********'; CREATE ROLE gaussdb=# GRANT USAGE ON SCHEMA myschema TO jack; GRANT 将用户jack对于myschema的usage权限收回。 1 2 gaussdb=# REVOKE USAGE ON SCHEMA myschema FROM jack; REVOKE
  • 使用Schema 在特定Schema下创建对象或者访问特定Schema下的对象,需要使用有Schema修饰的对象名。该名称包含Schema名以及对象名,Schema名和对象名之间用“.”分开。 执行如下命令在myschema下创建mytable表。 1 2 gaussdb=# CREATE TABLE myschema.mytable(id int, name varchar(20)); CREATE TABLE 执行如下命令查询myschema下mytable表的所有数据。 1 2 3 4 gaussdb=# SELECT * FROM myschema.mytable; id | name ----+------ (0 rows)
  • 注意事项 GaussDB包含一个或多个已命名数据库。用户和用户组在数据库范围内是共享的,但是其数据并不共享。任何与服务器连接的用户都只能访问连接请求里声明的数据库。 一个数据库可以包含一个或多个已命名的Schema,Schema又包含表及其他数据库对象,包括数据类型、函数和操作符等。同一对象名可以在不同的Schema中使用而不会引起冲突。例如,schema1和schema2都可以包含一个名为mytable的表。 和数据库不同,Schema不是严格分离的。用户根据其对Schema的权限,可以访问所连接数据库的Schema中的对象。进行Schema权限管理首先需要对数据库的权限控制进行了解。 不能创建以PG_为前缀的Schema名,该类Schema名为数据库系统预留的。 在每次创建新用户时,系统会在当前登录的数据库中为新用户创建一个同名Schema。对于其他数据库,若需要同名Schema,则需要用户手动创建。 通过未修饰的表名(名称中只含有表名,没有“Schema名”)引用表时,系统会通过search_path(搜索路径)来判断该表是哪一个Schema下的表。pg_temp和pg_catalog始终会作为搜索路径顺序中的前两位,无论二者是否出现在search_path中,或者出现在search_path中的任何位置。search_path(搜索路径)是一个Schema名列表,在其中找到的第一个表就是目标表,如果没有找到则报错。(某个表即使存在,如果它的Schema不在search_path中,依然会查找失败)在搜索路径中的第一个Schema称为“当前Schema”,它是搜索时查询的第一个Schema,同时在没有声明Schema名时,新创建的数据库对象会默认存放在该Schema下。 每个数据库都包含一个pg_catalog Schema,它包含系统表和所有内置数据类型、函数和操作符。pg_catalog是搜索路径中的一部分,始终在临时表所属的模式后面,并在search_path中所有模式的前面,即具有第二搜索优先级,以确保可以搜索到数据库内置对象。以确保搜索到数据库内置对象。当用户需要创建与系统内置对象同名的自定义对象时,可以在该对象所属的Schema中执行操作,避免命名冲突。
共100000条
提示

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