openGauss学习笔记-122 openGauss 数据库管理-设置密态等值查询-密态支持函数/存储过程

文章目录

    • [openGauss学习笔记-122 openGauss 数据库管理-设置密态等值查询-密态支持函数/存储过程](#openGauss学习笔记-122 openGauss 数据库管理-设置密态等值查询-密态支持函数/存储过程)
      • [122.1 创建并执行涉及加密列的函数/存储过程](#122.1 创建并执行涉及加密列的函数/存储过程)

openGauss学习笔记-122 openGauss 数据库管理-设置密态等值查询-密态支持函数/存储过程

密态支持函数/存储过程当前版本只支持sql和PL/pgSQL两种语言。由于密态支持存储过程中创建和执行函数/存储过程对用户是无感知的,因此语法和非密态无区别。

密态等值查询支持函数存储过程新增系统表gs_encrypted_proc,用于存储参数返回的原始数据类型。

122.1 创建并执行涉及加密列的函数/存储过程

  1. 创建密钥,详细步骤请参考使用gsql操作密态数据库使用JDBC操作密态数据库

  2. 创建加密表。

    sql 复制代码
    openGauss=# CREATE TABLE creditcard_info (
    openGauss(#   id_number int,
    openGauss(#   name  text,
    openGauss(#   credit_card varchar(19) encrypted with (column_encryption_key = ImgCEK1, encryption_type = DETERMINISTIC)
    openGauss(# ) with (orientation=row);
    CREATE TABLE
  3. 插入数据。

    sql 复制代码
    openGauss=# insert into creditcard_info values(1, 'Avi', '1234567890123456');
    INSERT 0 1
    openGauss=# insert into creditcard_info values(2, 'Eli', '2345678901234567');
    INSERT 0 1
  4. 创建函数支持密态等值查询。

    sql 复制代码
    openGauss=# CREATE FUNCTION f_encrypt_in_sql(val1 text, val2 varchar(19)) RETURNS text AS 'SELECT name from creditcard_info where name=$1 or credit_card=$2 LIMIT 1' LANGUAGE SQL;
    CREATE FUNCTION
    openGauss=# CREATE FUNCTION f_encrypt_in_plpgsql (val1 text, val2 varchar(19), OUT c text) AS $$
    openGauss$# BEGIN
    openGauss$# SELECT into c name from creditcard_info where name=$1 or credit_card =$2 LIMIT 1;
    openGauss$# END; $$
    openGauss-# LANGUAGE plpgsql;
    CREATE FUNCTION
  5. 执行函数。

    sql 复制代码
    openGauss=# SELECT f_encrypt_in_sql('Avi','1234567890123456');
     f_encrypt_in_sql
    ------------------
     Avi
    (1 row)
    
    openGauss=# SELECT f_encrypt_in_plpgsql('Avi', val2=>'1234567890123456');
     f_encrypt_in_plpgsql
    ----------------------
     Avi
    (1 row)

说明:

  • 函数/存储过程中的"执行动态查询语句"中的查询是在执行过程中编译,因此函数/存储过程中的表名、列名不能在创建阶段未知,输入参数不能用于表名、列名或以任何方式连接。
  • 在RETURNS、IN和OUT的参数中,不支持混合使用加密和非加密类型参数。虽然参数类型都是原始数据类型,但实际类型不同。
  • 对高级包接口中,如dbe_output.print_line()等在服务端打印输出的接口不会做解密操作,加密数据类型在强转成明文原始数据类型时会打印出该数据类型的默认值。
  • 当前版本函数/存储过程的LANGUAGE只支持SQL和PL/pgSQL,不支持C和JAVA等其他过程语言。
  • 不支持在函数/存储过程中执行其他查询加密列的函数/存储过程。
  • 当前版本不支持default、DECLARE中为变量赋予默认值,且不支持对DECLARE中的返回值进行解密,用户可以用执行函数时用输入参数、输出参数来代替使用。
  • 不支持gs_dump对涉及加密列的function进行备份。
  • 不支持在函数/存储过程中创建密钥。
  • 该版本密态函数/存储过程不支持触发器。
  • 密态等值查询函数/存储过程不支持对PL/pgSQL语言对语法进行转义,对于语法主体带有引号的语法CREATE FUNCTION AS '语法主体', 可以用CREATE FUNCTION AS '语法主体' 代替。
  • 不支持在密态等值查询函数/存储过程中执行修改加密列定义的操作,包括创建加密表、添加加密列,由于执行函数是在服务端,客户端没法判断是否是需要刷新缓存,得断开连接后或触发刷新客户端加密列缓存才可以对该列做加密操作。
  • 密态支持函数在创建加密函数时会在系统表gs_encrypted_proc中添加参数对应的加密列的oid,因此删除表后重建同名表可能会使密态函数失效,需要重新创建密态函数。
    👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!

相关推荐
武子康14 分钟前
Java-122 深入浅出 MySQL CAP理论详解与分布式事务实践:从2PC到3PC与XA模式
java·大数据·数据库·分布式·mysql·性能优化·系统架构
爱考证的小刘25 分钟前
阿里云ACA认证[特殊字符]阿里云ACP认证
数据库·阿里云·云计算
Databend29 分钟前
基于 Databend 的实时数据汇聚平台建设
数据库
玄尺_0071 小时前
bug:uniCloud报Business Failed, 参数有误retry invoke error
数据库·bug
@CLoudbays_Martin111 小时前
CDN是否能有效检测并且同时防御Ddos 和 CC 攻击?
java·服务器·网络·数据库·git·数据库开发·时序数据库
爱喝水的鱼丶1 小时前
SAP-MM:SAP采购组织全面学习指南:从概念到实战配置图解
运维·开发语言·数据库·学习·sap·mm模块·采购组织
深鱼~2 小时前
DbGate数据库管理新方案:cpolar打造跨平台远程访问通道
数据库
WAWA战士2 小时前
mysql总结
数据库
熊思宇2 小时前
Sqlite“无法加载 DLL“e_sqlite3”: 找不到指定的模块”解决方法
数据库·sqlite
往事随风去2 小时前
面试官:mysql从数据库断开一段时间后,部分binlog已丢失,如何重建主从?
运维·数据库·mysql