使用Intel SGX 安全增强型规格的数据库实例时,支持修改列类型(明文类型修改为密文类型,密文类型修改为明文类型)。

前提条件

语法

ALTER TABLE <table_name> 
    ALTER COLUMN <column_name> [SET DATA] TYPE <目标类型> 
    USING <类型转换函数>(<column_name>[, <keyname>]);
说明
  • 密文转换明文时,只需配置column_name参数。
  • 明文转换密文时,可仅配置column_name参数,或可同时配置column_namekeyname
表 1. 类型转换函数说明
明文类型 密文类型 明文到密文转换函数 密文到明文转换函数
int4 enc_int4 encdb.enc_int4_encrypt encdb.decrypt
int8 enc_int8 encdb.enc_int8_encrypt encdb.decrypt
float4 enc_float4 encdb.enc_float4_encrypt encdb.decrypt
float8 enc_float8 encdb.enc_float8_encrypt encdb.decrypt
numeric enc_decimal encdb.enc_decimal_encrypt encdb.decrypt
text enc_text encdb.enc_text_encrypt encdb.decrypt
timestamp enc_timestamp encdb.enc_timestamp_encrypt encdb.decrypt

使用示例

  • 使用构建的keyname对应的密钥将明文列修改为密文列。
    1. 构建keyname。
      SELECT encdb.keyname_generate(<user_name>, <database_name>, <schema_name>, <table_name>, <column_name>);
    2. 为keyname生成密钥。
      SELECT encdb.dek_generate(<keyname>[, <json_params>]);
      encdb.dek_generate中的参数json_params可选,使用标准JSON格式,可配置的键值对范围如下:
      说明
      algorithm 加密算法。

      默认值:AES_128_GCM。

      policy DEFAULT 加密策略,预留参数,当前固定配置为DEFAULT。
      flags
      • RND
      • DET
      加密方案。
      • RND:随机加密。
      • DET:确定性加密。

      默认值:RND。

      mekid 目标用户的MEK ID。 用于生成DEK的用户主密钥ID。

      默认为当前连接用户的主密钥ID。

    3. 使用keyname对应的密钥,将明文列(例如int4)修改为对应类型的密文列(例如enc_int4)。
      ALTER TABLE <table_name> ALTER COLUMN <column_name> SET DATA TYPE enc_int4 USING encdb.enc_int4_encrypt(<column_name>, <keyname>);
  • 使用当前数据库默认密钥将明文列修改为密文列。
    说明 当前数据库默认密钥的keyname为|<user>|<database>|
    ALTER TABLE <table_name> ALTER COLUMN <column_name> SET DATA TYPE enc_int4 USING encdb.enc_int4_encrypt(<column_name>);
  • 将密文列修改为明文列。
    ALTER TABLE <table_name> ALTER COLUMN <column_name> SET DATA TYPE int4 USING encdb.decrypt(<column_name>);