华为云用户手册

  • 参数 表1 SQLGetData参数 关键字 参数说明 StatementHandle 语句句柄,通过SQLAllocHandle获得。 Col_or_Param_Num 要返回数据的列号。结果集的列按增序从1开始编号。书签列的列号为0。 TargetType TargetValuePtr缓冲中的C数据类型的类型标识符。若TargetType为SQL_ARD_TYPE,驱动使用ARD中SQL_DESC_CONCISE_TYPE字段的类型标识符。若为SQL_C_DEFAULT,驱动根据源的SQL数据类型选择缺省的数据类型。 TargetValuePtr 输出参数:指向返回数据所在缓冲区的指针。 BufferLength TargetValuePtr所指向缓冲区的长度。 StrLen_or_IndPtr 输出参数:指向缓冲区的指针,在此缓冲区中返回长度或标识符的值。
  • 示例 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 下面存储过程中用到的表定义如下: postgres=# \d emp_rec Table "public.emp_rec" Column | Type | Modifiers ----------+--------------------------------+----------- empno | numeric(4,0) | not null ename | character varying(10) | job | character varying(9) | mgr | numeric(4,0) | hiredate | timestamp(0) without time zone | sal | numeric(7,2) | comm | numeric(7,2) | deptno | numeric(2,0) | --演示在存储过程中对数组进行操作。 postgres=# CREATE OR REPLACE FUNCTION regress_record(p_w VARCHAR2) RETURNS VARCHAR2 AS $$ DECLARE --声明一个record类型. type rec_type is record (name varchar2(100), epno int); employer rec_type; --使用%type声明record类型 type rec_type1 is record (name emp_rec.ename%type, epno int not null :=10); employer1 rec_type1; --声明带有默认值的record类型 type rec_type2 is record ( name varchar2 not null := 'SCOTT', epno int not null :=10); employer2 rec_type2; CURSOR C1 IS select ename,empno from emp_rec order by 1 limit 1; BEGIN --对一个record类型的变量的成员赋值。 employer.name := 'WARD'; employer.epno = 18; raise info 'employer name: % , epno:%', employer.name, employer.epno; --将一个record类型的变量赋值给另一个变量。 employer1 := employer; raise info 'employer1 name: % , epno: %',employer1.name, employer1.epno; --将一个record类型变量赋值为NULL。 employer1 := NULL; raise info 'employer1 name: % , epno: %',employer1.name, employer1.epno; --获取record变量的默认值。 raise info 'employer2 name: % ,epno: %', employer2.name, employer2.epno; --在for循环中使用record变量 for employer in select ename,empno from emp_rec order by 1 limit 1 loop raise info 'employer name: % , epno: %', employer.name, employer.epno; end loop; --在select into 中使用record变量。 select ename,empno into employer2 from emp_rec order by 1 limit 1; raise info 'employer name: % , epno: %', employer2.name, employer2.epno; --在cursor中使用record变量。 OPEN C1; FETCH C1 INTO employer2; raise info 'employer name: % , epno: %', employer2.name, employer2.epno; CLOSE C1; RETURN employer.name; END; $$ LANGUAGE plpgsql; --调用该存储过程。 postgres=# CALL regress_record('abc'); --删除存储过程。 postgres=# DROP PROCEDURE regress_record;
  • 操作步骤 创建源表products,并插入数据。 1 2 3 4 5 6 7 8 9 10 11 postgres=# CREATE TABLE products ( product_id INTEGER, product_name VARCHAR2(60), category VARCHAR2(60) ); postgres=# INSERT INTO products VALUES (1502, 'olympus camera', 'electrncs'), (1601, 'lamaze', 'toys'), (1666, 'harry potter', 'toys'), (1700, 'wait interface', 'books'); 创建目标表newproducts,并插入数据。 1 2 3 4 5 6 7 8 9 10 11 12 postgres=# CREATE TABLE newproducts ( product_id INTEGER, product_name VARCHAR2(60), category VARCHAR2(60) ); postgres=# INSERT INTO newproducts VALUES (1501, 'vivitar 35mm', 'electrncs'), (1502, 'olympus ', 'electrncs'), (1600, 'play gym', 'toys'), (1601, 'lamaze', 'toys'), (1666, 'harry potter', 'dvd'); 使用MERGE INTO 语句将源表products的数据合并至目标表newproducts。 1 2 3 4 5 6 7 postgres=# MERGE INTO newproducts np USING products p ON (np.product_id = p.product_id ) WHEN MATCHED THEN UPDATE SET np.product_name = p.product_name, np.category = p.category WHEN NOT MATCHED THEN INSERT VALUES (p.product_id, p.product_name, p.category) ; 上述语句中使用的参数说明,请见表1。更多信息,请参见MERGE INTO。 表1 MERGE INTO语句参数说明 参数 说明 举例 INTO 子句 指定需要更新或插入数据的目标表。 目标表支持指定别名。 目标表支持复制表,但复制表不能带有含volatile函数的列(如自增列);如果enable_stream_operator=off,目标复制表需要带有主键或某一列满足unique not null约束。 取值:newproducts np 说明:名为newproducts,别名为np的目标表。 USING子句 指定源表。源表支持指定别名。 目标表是复制表时,源表也需要是复制表。 取值:products p 名为products,别名为p的源表。 ON子句 指定目标表和源表的关联条件。 关联条件中的字段不支持更新。 取值:np.product_id = p.product_id 说明:指定的关联条件为,目标表newproducts的product_id字段和源表products的product_id字段相等。 WHEN MATCHED子句 当源表和目标表中数据针对关联条件可以匹配上时,选择WHEN MATCHED子句进行UPDATE操作。 仅支持指定一个WHEN MATCHED子句。 WHEN MATCHED子句可缺省,缺省时,对于满足ON子句条件的行,不进行任何操作。 若目标表中存在分布列,则该列不支持更新。 取值:WHEN MATCHED THEN UPDATE SET np.product_name = p.product_name, np.category = p.category 说明:当满足ON子句条件时,将目标表newproducts的product_name、category字段的值替换为源表products相对应字段的值。 WHEN NOT MATCHED子句 当源表和目标表中数据针对关联条件无法匹配时,选择WHEN NOT MATCHED子句进行INSERT操作。 仅支持指定一个WHEN NOT MATCHED子句。 WHEN NOT MATCHED子句可缺省。 不支持INSERT子句中包含多个VALUES。 WHEN MATCHED和WHEN NOT MATCHED子句顺序可以交换,可以缺省其中一个,但不能同时缺省。 取值:WHEN NOT MATCHED THEN INSERT VALUES (p.product_id, p.product_name, p.category) 说明:将源表products中,不满足ON子句条件的行插入目标表products。 查询合并后的目标表newproducts。 1 postgres=# SELECT * FROM newproducts; 返回信息如下: product_id | product_name | category ------------+----------------+----------- 1501 | vivitar 35mm | electrncs 1502 | olympus camera | electrncs 1666 | harry potter | toys 1600 | play gym | toys 1601 | lamaze | toys 1700 | wait interface | books (6 rows)
  • 语法 语法请参见图1。 图1 call_anonymous_block::= using_clause子句的语法参见图2。 图2 using_clause::= 对以上语法格式的解释如下: 匿名块程序实施部分,以BEGIN语句开始,以END语句停顿,以一个分号结束。 USING [IN|OUT|IN OUT] bind_argument,用于指定存放传递给存储过程参数值的变量。bind_argument前的修饰符与对应参数的修饰符一致。 匿名块中间的输入输出参数使用占位符来指明,要求占位符个数与参数个数相同,并且占位符所对应参数的顺序和USING中参数的顺序一致。 目前GaussDB在动态语句调用匿名块时,EXCEPTION语句中暂不支持使用占位符进行输入输出参数的传递。 不支持调用带有占位符的重载函数。 不支持绑定参数时使用PERFORM关键字调用存储过程。 不支持同一条语句同时使用匿名块内声明的变量和绑定参数。 仅支持匿名块中调用SQL语句绑定参数,其余绑定参数场景皆不支持。例如:匿名块中调用存储过程,匿名块中使用表达式以及cursor等、匿名块中嵌套调用动态语句。
  • 参数说明 参数 参数说明 ctx 表示给定的上下文。 query 被执行的SQL语句。 args 被执行SQL语句需要绑定的参数。支持按位置绑定和按名称绑定,详情见如下示例。 opts 事务隔离级别和事务访问模式,其中事务隔离级别(opts.Isolation)支持范围为sql.LevelReadUncommitted,sql.LevelReadCommitted,sql.LevelRepeatableRead,sql.LevelSerializable。事务访问模式(opts.ReadOnly)支持范围为true(read only)和false(read write)。
  • macaddr函数 函数trunc(macaddr)返回一个MAC地址,该地址的最后三个字节设置为零。 trunc(macaddr) 描述:把后三个字节置为零。 返回类型:macaddr 示例: 1 2 3 4 5 gaussdb=# SELECT trunc(macaddr '12:34:56:78:90:ab') AS RESULT; result ------------------- 12:34:56:00:00:00 (1 row)
  • 注意事项 不能在该循环语句中对查询的表进行更新操作。 变量loop_name会自动定义且只在此循环中有效,类型和select_statement的查询结果类型一致。loop_name的取值就是select_statement的查询结果。 变量loop_name在编译过程中不会解析具体的类型,如果有需要解析具体类型的场景(比如loop_name作为重载函数或者存储过程的出入参)会编译报错。如需解析变量的具体类型,可以设置参数behavior_compat_options值为allow_procedure_compile_check。
  • 示例 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 31 32 33 34 35 36 37 38 39 BEGIN FOR ROW_TRANS IN SELECT first_name FROM hr.staffs LOOP DBE_OUTPUT.PRINT_LINE (ROW_TRANS.first_name ); END LOOP; END; / --创建表 CREATE TABLE integerTable1( A INTEGER); CREATE TABLE integerTable2( B INTEGER); INSERT INTO integerTable2 VALUES(2); --多游标共享游标属性的标量 DECLARE CURSOR C1 IS SELECT A FROM integerTable1;--声明游标 CURSOR C2 IS SELECT B FROM integerTable2; PI_A INTEGER; PI_B INTEGER; BEGIN OPEN C1;--打开游标 OPEN C2; FETCH C1 INTO PI_A; ---- C1%FOUND 和 C2%FOUND 值为 FALSE FETCH C2 INTO PI_B; ---- C1%FOUND 和 C2%FOUND 的值都为 TRUE --判断游标状态 IF C1%FOUND THEN IF C2%FOUND THEN DBE_OUTPUT.PRINT_LINE('Dual cursor share paremeter.'); END IF; END IF; CLOSE C1;--关闭游标 CLOSE C2; END; / --删除临时表 DROP TABLE integerTable1; DROP TABLE integerTable2;
  • 参数 表1 SQLSetEnvAttr参数 关键字 参数说明 EnvironmentHandle 环境句柄。 Attribute 需设置的环境属性,可为如下值: SQL_ATTR_ODBC_VERSION:指定ODBC版本。 SQL_CONNECTION_POOLING:连接池属性。 SQL_OUTPUT_NTS:指明驱动器返回字符串的形式。 ValuePtr 指向对应Attribute的值。依赖于Attribute的值,ValuePtr可能是32位整型值,或为以空结束的字符串。 StringLength 如果ValuePtr指向字符串或二进制缓冲区,这个参数是*ValuePtr长度,如果ValuePtr指向整型,忽略StringLength。
  • 原型 1 2 3 4 SQLRETURN SQLSetEnvAttr(SQLHENV EnvironmentHandle SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER StringLength);
  • 嵌套赋值 给变量嵌套赋值的语法请参见图2。 图2 nested_assignment_value::= 对以上语法格式的解释如下:图2 variable_name:变量名。 col_name:列名。 subscript:下标,针对数组变量使用,可以是值或表达式,类型必须为int。 value:可以是值或表达式。值value的类型需要和变量variable_name的类型兼容才能正确赋值。 示例: 1 2 3 4 5 6 7 8 9 gaussdb=# CREATE TYPE o1 as (a int, b int); gaussdb=# DECLARE TYPE r1 is VARRAY(10) of o1; emp_id r1; BEGIN emp_id(1).a := 5;--赋值 emp_id(1).b := 5*7784; END; /
  • 语法格式 SELECT select_expressions INTO [STRICT] target FROM ... SELECT INTO [STRICT] target expression [FROM ..] 通过基础 SQL 命令加INTO子句可以将单行或多列的结果赋值给一个变量(记录、行类型、标量变量列表)。 target参数可以是一个记录变量、一个行变量或一个有逗号分隔的简单变量和记录/行域列表。 STRICT选项 在开启参数set behavior_compat_options = 'select_into_return_null'的前提下(默认未开启),若指定该选项则该查询必须刚好返回一行不为空的结果集,否则会报错,报错信息可能是NO_DATA_FOUND(没有行)、TOO_MANY_ROWS(多于一行)或QUERY_RETURNED_NO_ROWS (没有数据返回)。若不指定该选项则没有该限定,且支持返回空结果集。
  • 创建C函数 以ISNUMBER为例: 1 2 3 4 create or replace function isnumber(text) returns integer as '...../isNumber.so', 'ISNUMBER' language c strict fenced IMMUTABLE SHIIPABLE; ...../isNumber.so 指定了库文件的路径。当enable_default_cfunc_libpath打开时,只需要指定文件名即可,数据库会自动在默认目录($libdir/proc_srclib)下查找该文件。当enable_default_cfunc_libpath关闭时,这里必须指定库文件的绝对路径。enable_default_cfunc_libpath参数默认打开。 属性strict,表示只要其中任意参数为NULL值,该函数就会返回空值,当有NULL参数时该函数不会被执行,而是自动返回一个空值结果。也就是说,如果函数创建时没有指定strict属性,则函数的C语言实现一定要对参数是否为NULL特殊处理,例如:maxdate的实现。否则,对NULL的不正确的使用可能引起进程的crash。 属性fenced,如果指定函数为fenced模式,则函数会在worker进程中被调用,防止C代码实现错误导致服务器crash,不建议使用not fenced模式。 属性IMMUTABLE,表示函数的结果只倚赖于它的输入参数。 属性SHIPPABLE,表示这个函数可以下推到DN执行。对于IMMUTABLE类型的函数,如果函数的返回值类型不是record,则可以下推到DN上执行。 对于STABLE/VOLATILE类型的函数,仅当函数的属性是SHIPPABLE的时候,函数可以下推到DN执行。 函数属性在CREATE FUNCTION章节会有详细介绍。
  • 编写代码 C语言函数的编写需要遵守基本的规则: 函数声明语法,Datum funcname(PG_FUNCTION_ARGS)。 申明函数是版本1格式,调用宏PG_FUNCTION_INFO_V1(funcname)。不使用宏则默认为版本0格式。 C文件中声明PG_MODULE_MAGIC,标记数据库的版本信息,防止动态库被加载到一个不兼容的服务器。 在分配内存时,使用函数palloc和pfree,而不是使用对应的C库函数malloc和free。在每个事务结束是会自动释放通过palloc申请的内存,以免内存泄露。 C文件中定义的符号名不能相互冲突或者与服务器中可执行程序中定义的符号冲突。如果有关于此的编译错误消息,你必须重命名你的函数或者变量。 开发者应充分了解要调用的内核函数接口功能及入参范围,在调用前应检查参数合法性,避免出现空指针等可能导致程序crash的问题。 自定义函数上线前应经过充分测试,避免引入问题影响数据库正常业务。
  • 示例 示例1:函数功能,返回两个时间中的较大的,文件名maxtimestamp.cpp,文件内容如下。 其中,PG_GETARG_TIMESTAMP(0)、PG_GETARG_TIMESTAMP(1)分别获取timestamp类型的第一个参数和第二个参数。PG_ARGISNULL(0)、PG_ARGISNULL(1)返回参数1、参数2是否为NULL。PG_RETURN_TIMESTAMP返回timestamp结果。
  • 编译生成动态库 在使用用户定义的C代码之前,必须编译链接生成一个能被服务器动态载入的文件。确切的说,需要生成一个共享库文件。 首先源文件被编译成一个目标文件,然后目标文件被连接起来。目标文件需要被创建成position-independent code (PIC),这意味着当它们被载入时,可以被放置在内存中的任意位置。 下面例子中,我们以文件isNumber.c为例,并且创建一个共享库isNumber.so。 Linux创建PIC的编译器标志是-fpic。在不同平台上的,需要参考GCC手册。创建一个共享库的编译器标志是-shared。一个完整的例子: gcc -fpic -c isNumber.cpp -I include/postgresql/server/ gcc -shared -o isNumber.so isNumber.o 上述命令也可以连在一起: gcc -shared -fpic -o isNumber.so isNumber.cpp -I include/postgresql/server/ 其中include/postgresql/server/ 为服务器对外发布的头文件路径,在安装目录下面。 gcc版本要求在7.3.0或者7.3.0之上。 为保证C函数兼容性,若涉及数据库升级,用户需要基于升级后的头文件重新编译C函数共享库。 在服务端加载过动态库后,不可在环境上手动修改该动态库,否则可能出现段错误或其他未知问题。
  • 语法格式 添加/删除审计策略中的操作类型。 ALTER AUDIT POLICY [ IF EXISTS ] policy_name { ADD | REMOVE } { privilege_audit_clause | access_audit_clause }; 修改审计策略中的过滤条件。 ALTER AUDIT POLICY [ IF EXISTS ] policy_name MODIFY ( filter_group_clause ); 将审计策略中的过滤条件删除。 ALTER AUDIT POLICY [ IF EXISTS ] policy_name DROP FILTER; 修改审计策略描述。 ALTER AUDIT POLICY [ IF EXISTS ] policy_name COMMENTS policy_comments; 打开或者关闭审计策略。 ALTER AUDIT POLICY [ IF EXISTS ] policy_name { ENABLE | DISABLE }; privilege_audit_clause: 审计策略中具体的DDL操作类型及目标资源标签。 1 PRIVILEGES ({ DDL | ALL } [ ON LABEL ( resource_label_name [, ... ] ) ]) access_audit_clause: 审计策略中具体的DML操作类型及目标资源标签。 ACCESS ({ DML | ALL } [ ON LABEL ( resource_label_name [, ... ] ) ]) filter_group_clause: 审计策略中的过滤条件。 1 FILTER ON { filter_type ( filter_value [, ... ] ) } [, ... ]
  • 参数说明 policy_name 审计策略名称,需要唯一,不可重复。 取值范围:字符串,要符合标识符命名规范。 DDL 指的是针对数据库执行如下操作时进行审计,目前支持:CREATE、ALTER、DROP、ANALYZE、COMMENT、GRANT、REVOKE、SET、SHOW。 ALL 指的是上述DDL支持的所有对数据库的操作。 DML 指的是针对数据库执行如下操作时进行审计,目前支持:SELECT、COPY、DEALLOCATE、DELETE、EXECUTE、INSERT、PREPARE、REINDEX、TRUNCATE、UPDATE。 FILTER_TYPE 指定审计策略的过滤信息,过滤类型包括:IP、ROLES、APP。 filter_value 指具体过滤信息内容。 policy_comments 用于记录策略相关的描述信息。 ENABLE|DISABLE 可以打开或关闭统一审计策略。
  • 参数说明 database_name 需要修改属性的数据库名称。 取值范围:字符串,要符合标识符命名规范。 connlimit 数据库可以接收的最大并发连接数(管理员用户连接除外)。 取值范围:[-1, 2^31-1]的整数,建议填写1~50的整数。-1(缺省)表示没有限制。 new_name 数据库的新名称。 取值范围:字符串,要符合标识符命名规范。 new_owner 数据库的新所有者。 取值范围:字符串,有效的用户名。 new_tablespace 数据库新的默认表空间,该表空间为数据库中已经存在的表空间。默认的表空间为pg_default。 取值范围:字符串,有效的表空间名。 configuration_parameter value 把指定的数据库会话参数值设置为给定的值。如果value是DEFAULT或者RESET,则在新的会话中使用系统的缺省设置。OFF关闭设置。 取值范围:字符串, DEFAULT OFF RESET time_zone 设置database_name的数据库的时区值,需要有对应的数据库的权限。 取值范围:字符串 系统支持的时区和其相应的缩写 -15:59到+15:00 FROM CURRENT 根据当前会话连接的数据库设置该参数的值。 RESET configuration_parameter 重置指定的数据库会话参数值。 RESET ALL 重置全部的数据库会话参数值。 修改数据库默认表空间,会将旧表空间中的所有表和索引转移到新表空间中,该操作不会影响其他非默认表空间中的表和索引。 修改的数据库会话参数值,将在下一次会话中生效。
  • 语法格式 修改数据库的最大连接数。 ALTER DATABASE database_name [ [ WITH ] CONNECTION LIMIT connlimit ]; 修改数据库名称。 ALTER DATABASE database_name RENAME TO new_name; 修改数据库所属者。 ALTER DATABASE database_name OWNER TO new_owner; 修改数据库默认表空间。 ALTER DATABASE database_name SET TABLESPACE new_tablespace; 如果该数据库中的某些表或对象已经创建在new_tablespace下,则无法将该数据库的默认表空间修改为new_tablespace,执行会报错。 修改数据库指定会话参数值。 ALTER DATABASE database_name SET configuration_parameter { { TO | = } { value | DEFAULT } | FROM CURRENT }; 数据库配置参数重置。 ALTER DATABASE database_name RESET { configuration_parameter | ALL };
  • 关闭连接 在使用数据库连接完成相应的数据操作后,需要关闭数据库连接。 关闭数据库连接可以直接调用其close方法即可。 // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String userName = System.getenv("EXAMPLE_USERNAME_ENV"); String password = System.getenv("EXAMPLE_PASSWORD_ENV"); Connection conn = DriverManager.getConnection(sourceURL, userName, password); conn.close(); 父主题: 基于JDBC开发
  • 示例 Synonym词典可用于解决语言学相关问题,例如,为避免使单词"Paris"变成"pari",可在Synonym词典文件中定义一行"Paris paris",并将该词典放置在预定义的english_stem词典之前。 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 31 32 33 34 35 36 37 38 39 40 41 gaussdb=# SELECT * FROM ts_debug('english', 'Paris'); alias | description | token | dictionaries | dictionary | lexemes -----------+-----------------+-------+----------------+--------------+--------- asciiword | Word, all ASCII | Paris | {english_stem} | english_stem | {pari} (1 row) gaussdb=# CREATE TEXT SEARCH DICTIONARY my_synonym ( TEMPLATE = synonym, SYNONYMS = my_synonyms, FILEPATH = 'file:///home/dicts/' ); gaussdb=# ALTER TEXT SEARCH CONFIGURATION english ALTER MAPPING FOR asciiword WITH my_synonym, english_stem; gaussdb=# SELECT * FROM ts_debug('english', 'Paris'); alias | description | token | dictionaries | dictionary | lexemes -----------+-----------------+-------+---------------------------+------------+--------- asciiword | Word, all ASCII | Paris | {my_synonym,english_stem} | my_synonym | {paris} (1 row) gaussdb=# SELECT * FROM ts_debug('english', 'paris'); alias | description | token | dictionaries | dictionary | lexemes -----------+-----------------+-------+---------------------------+------------+--------- asciiword | Word, all ASCII | Paris | {my_synonym,english_stem} | my_synonym | {paris} (1 row) gaussdb=# ALTER TEXT SEARCH DICTIONARY my_synonym ( CASESENSITIVE=true); gaussdb=# SELECT * FROM ts_debug('english', 'Paris'); alias | description | token | dictionaries | dictionary | lexemes -----------+-----------------+-------+---------------------------+------------+--------- asciiword | Word, all ASCII | Paris | {my_synonym,english_stem} | my_synonym | {paris} (1 row) gaussdb=# SELECT * FROM ts_debug('english', 'paris'); alias | description | token | dictionaries | dictionary | lexemes -----------+-----------------+-------+---------------------------+------------+--------- asciiword | Word, all ASCII | Paris | {my_synonym,english_stem} | my_synonym | {pari} (1 row) 其中,同义词词典文件全名为my_synonyms.syn,所在目录为当前连接数据库主节点的/home/dicts/下。关于创建词典的语法和更多参数,请参见ALTER TEXT SEARCH DICTIONARY。 星号(*)可用于词典文件中的同义词结尾,表示该同义词是一个前缀。在to_tsvector()中该星号将被忽略,但在to_tsquery()中会匹配该前缀并对应输出结果(参照处理查询一节)。 假设词典文件synonym_sample.syn内容如下: 1 2 gogle googl indices index* 创建并使用词典: 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 31 32 33 34 35 36 37 38 gaussdb=# CREATE TEXT SEARCH DICTIONARY syn ( TEMPLATE = synonym, SYNONYMS = synonym_sample ); gaussdb=# SELECT ts_lexize('syn','indices'); ts_lexize ----------- {index} (1 row) gaussdb=# CREATE TEXT SEARCH CONFIGURATION tst (copy=simple); gaussdb=# ALTER TEXT SEARCH CONFIGURATION tst ALTER MAPPING FOR asciiword WITH syn; gaussdb=# SELECT to_tsvector('tst','indices'); to_tsvector ------------- 'index':1 (1 row) gaussdb=# SELECT to_tsquery('tst','indices'); to_tsquery ------------ 'index':* (1 row) gaussdb=# SELECT 'indexes are very useful'::tsvector; tsvector --------------------------------- 'are' 'indexes' 'useful' 'very' (1 row) gaussdb=# SELECT 'indexes are very useful'::tsvector @@ to_tsquery('tst','indices'); ?column? ---------- t (1 row)
  • 示例 gaussdb=# deallocate all; DEALLOCATE ALL gaussdb=# prepare p1 as insert /*+ no_gpc*/ into t1 select c1,c2 from t2 where c1=$1; PREPARE gaussdb=# execute p1(3); INSERT 0 1 gaussdb=# select * from dbe_perf.global_plancache_status where schema_name='public' order by 1,2; nodename | query | refcount | valid | databaseid | schema_name | params_num | func_id | pkg_id | stmt_id ----------+-------+----------+-------+------------+-------------+------------+---------+--------+--------- (0 rows) dbe_perf.global_plancache_status视图中无结果即没有计划被全局缓存。
  • 示例 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 --创建dev_mask和bob_mask用户。 gaussdb=# CREATE USER dev_mask PASSWORD '********'; gaussdb=# CREATE USER bob_mask PASSWORD '********'; --创建一个表tb_for_masking。 gaussdb=# CREATE TABLE tb_for_masking(idx int, col1 text, col2 text, col3 text, col4 text, col5 text, col6 text, col7 text,col8 text); gaussdb=# INSERT INTO tb_for_masking VALUES(1, '9876543210', 'usr321usr', 'abc@huawei.com', 'abc@huawei.com', '1234-4567-7890-0123', 'abcdef 123456 ui 323 jsfd321 j3k2l3', '4880-9898-4545-2525', 'this is a llt case'); gaussdb=# INSERT INTO tb_for_masking VALUES(2, '0123456789', 'lltc123llt', 'abc@gmail.com', 'abc@gmail.com', '9876-5432-1012-3456', '1234 abcd ef 56 gh78ijk90lm', '4856-7654-1234-9865','this,is.a!LLT?case'); --创建资源标签标记敏感列。 gaussdb=# CREATE RESOURCE LABEL mask_lb1 ADD COLUMN(tb_for_masking.col1); gaussdb=# CREATE RESOURCE LABEL mask_lb2 ADD COLUMN(tb_for_masking.col2); gaussdb=# CREATE RESOURCE LABEL mask_lb3 ADD COLUMN(tb_for_masking.col3); gaussdb=# CREATE RESOURCE LABEL mask_lb4 ADD COLUMN(tb_for_masking.col4); gaussdb=# CREATE RESOURCE LABEL mask_lb5 ADD COLUMN(tb_for_masking.col5); gaussdb=# CREATE RESOURCE LABEL mask_lb6 ADD COLUMN(tb_for_masking.col6); gaussdb=# CREATE RESOURCE LABEL mask_lb7 ADD COLUMN(tb_for_masking.col7); gaussdb=# CREATE RESOURCE LABEL mask_lb8 ADD COLUMN(tb_for_masking.col8); --创建脱敏策略。 gaussdb=# CREATE MASKING POLICY maskpol1 maskall ON LABEL(mask_lb1); gaussdb=# CREATE MASKING POLICY maskpol2 alldigitsmasking ON LABEL(mask_lb2); gaussdb=# CREATE MASKING POLICY maskpol3 basicemailmasking ON LABEL(mask_lb3); gaussdb=# CREATE MASKING POLICY maskpol4 fullemailmasking ON LABEL(mask_lb4); gaussdb=# CREATE MASKING POLICY maskpol5 creditcardmasking ON LABEL(mask_lb5); gaussdb=# CREATE MASKING POLICY maskpol6 shufflemasking ON LABEL(mask_lb6); gaussdb=# CREATE MASKING POLICY maskpol7 regexpmasking('[\d+]','*',2, 9) ON LABEL(mask_lb7); --创建仅对用户dev_mask和bob_mask,客户端工具为gsql,IP地址为'10.20.30.40', '127.0.0.0/24'场景下生效的脱敏策略。 gaussdb=# CREATE MASKING POLICY maskpol8 randommasking ON LABEL(mask_lb8) FILTER ON ROLES(dev_mask, bob_mask), APP(gsql), IP('10.20.30.40', '127.0.0.0/24'); --查看脱敏策略生效 gaussdb=# SELECT * FROM tb_for_masking; idx | col1 | col2 | col3 | col4 | col5 | col6 | col7 | col8 -----+------------+------------+----------------+----------------+---------------------+-------------------------------------+---------------------+-------------------- 1 | xxxxxxxxxx | usr000usr | xxx@huawei.com | xxx@xxxxxx.com | xxxx-xxxx-xxxx-0123 | s 2iju1bcjk243df333d61l 22 53ef3a | 48**-****-*545-2525 | this is a llt case 2 | xxxxxxxxxx | lltc000llt | xxx@gmail.com | xxx@xxxxx.com | xxxx-xxxx-xxxx-3456 | j 71fem0l286dbia543 g k9 ch | 48**-****-*234-9865 | this,is.a!LLT?case (2 rows) --使用gsql工具,IP地址为'10.20.30.40',用户dev_mask查看tb_for_masking。 gaussdb=# GRANT ALL PRIVILEGES TO dev_mask; gaussdb=# GRANT ALL PRIVILEGES TO bob_mask; gaussdb=# SET role dev_mask PASSWORD 'xxxxxxxxxx'; --使用maskpol8脱敏,结果随机,每次不同。 gaussdb=# SELECT col8 FROM tb_for_masking; col8 -------------------- 9f1425b3835cc30d99 9585b4ea8ea8ddcc5b (2 rows) gaussdb=# SET role bob_mask PASSWORD 'xxxxxxxxxx'; gaussdb=# SELECT col8 FROM tb_for_masking; col8 -------------------- f29ef3a0769a1f417c 806aa46409482d838f (2 rows) --删除脱敏策略。 gaussdb=# DROP MASKING POLICY maskpol1, maskpol2, maskpol3, maskpol4, maskpol5, maskpol6, maskpol7, maskpol8; --删除资源标签。 gaussdb=# DROP RESOURCE LABEL mask_lb1, mask_lb2, mask_lb3, mask_lb4, mask_lb5, mask_lb6, mask_lb7, mask_lb8; --删除表tb_for_masking。 gaussdb=# DROP TABLE tb_for_masking; --删除用户dev_mask和bob_mask。 gaussdb=# DROP USER dev_mask, bob_mask;
  • 审计管理员 审计管理员是指具有AUDITADMIN属性的账户,具有查看和删除审计日志的权限。 要创建新的审计管理员,三权分立关闭时,请以系统管理员或者安全管理员身份连接数据库,三权分立打开时,请以安全管理员身份连接数据库,并使用带AUDITADMIN选项的CREATE USER语句或ALTER USER语句进行设置。 1 gaussdb=# CREATE USER auditadmin WITH AUDITADMIN password "********"; 或者 1 gaussdb=# ALTER USER joe AUDITADMIN; ALTER USER时,要求用户已存在。
  • 监控管理员 监控管理员是指具有MONADMIN属性的账户,具有查看dbe_perf模式下视图和函数的权限,亦可以对dbe_perf模式的对象权限进行授予或收回。 要创建新的监控管理员,请以系统管理员身份连接数据库,并使用带MONADMIN选项的CREATE USER语句或ALTER USER语句进行设置。 1 gaussdb=# CREATE USER monadmin WITH MONADMIN password "********"; 或者 1 gaussdb=# ALTER USER joe MONADMIN; ALTER USER时,要求用户已存在。
  • 运维管理员 运维管理员是指具有OPRADMIN属性的账户,具有使用Roach工具执行备份恢复的权限。 要创建新的运维管理员,请以初始用户身份连接数据库,并使用带OPRADMIN选项的CREATE USER语句或ALTER USER语句进行设置。 1 gaussdb=# CREATE USER opradmin WITH OPRADMIN password "********"; 或者 1 gaussdb=# ALTER USER joe OPRADMIN; ALTER USER时,要求用户已存在。
  • 安全管理员 安全管理员是指具有CREATEROLE属性的账户,具有创建、修改、删除用户或角色的权限。 要创建新的安全管理员,三权分立关闭时,请以系统管理员或者安全管理员身份连接数据库,三权分立打开时,请以安全管理员身份连接数据库,并使用带CREATEROLE选项的CREATE USER语句或ALTER USER语句进行设置。 1 gaussdb=# CREATE USER createrole WITH CREATEROLE password "********"; 或者 1 gaussdb=# ALTER USER joe CREATEROLE; ALTER USER时,要求用户已存在。
  • 安全策略管理员 安全策略管理员是指具有POLADMIN属性的账户,具有创建资源标签,脱敏策略和统一审计策略的权限。 要创建新的安全策略管理员,请以系统管理员用户身份连接数据库,并使用带POLADMIN选项的CREATE USER语句或ALTER USER语句进行设置。 1 gaussdb=# CREATE USER poladmin WITH POLADMIN password "********"; 或者 1 gaussdb=# ALTER USER joe POLADMIN; ALTER USER时,要求用户已存在。
  • 初始用户 数据库安装过程中自动生成的账户称为初始用户。初始用户也是系统管理员、监控管理员、运维管理员和安全策略管理员,拥有系统的最高权限,能够执行所有的操作。如果安装时不指定初始用户名称则该账户与进行数据库安装的操作系统用户同名。如果在安装时不指定初始用户的密码,安装完成后密码为空,在执行其他操作前需要通过gsql客户端修改初始用户的密码。如果初始用户密码为空,则除修改密码外无法执行其他SQL操作以及升级、扩容、节点替换等操作。 初始用户会绕过所有权限检查。建议仅将此初始用户作为DBA管理用途,而非业务应用。
共100000条