【问题标题】:Data masking in oracle 12coracle 12c 中的数据屏蔽
【发布时间】:2017-01-18 13:02:35
【问题描述】:

在oracle 12c中屏蔽后如何更新表中特定列的值?

我的桌子:

detail_table(
 id number,
 source_num varchar2(20), 
 destination_num varchar2(20)
) 

它包含 2.5 亿条记录。如何像这样屏蔽 source_num、destination_num 列:

                source_num 
before masking: 1234567896
after masking:  123456XXXX (excluding first six characters all need to be replaced by X).

destination_num 也将应用相同的规则。表中的现有值需要替换为掩码值。我已经阅读了一些关于 oracle 12c 中数据编辑的文章,但提到它是因为我们只能选择屏蔽数据,而不能选择更新。

【问题讨论】:

    标签: oracle oracle12c


    【解决方案1】:
    WITH tst AS
      (SELECT '1234567890' AS col FROM dual
      )
    SELECT col    AS col1,
      LENGTH(col) AS col2,
      REGEXP_REPLACE(col, '.', 'x', 7) col3,
      LENGTH(REGEXP_REPLACE(col, '.', 'x', 7)) col4
    FROM tst
    

    我不知道您所说的 25 Cr 记录 是什么意思。 假设它有很多数据(数百万),我会推荐:

    • 使用更新的列创建新表
    • 删除第一个表(记住在此操作期间需要禁用的索引和其他内容)
    • 将新表重命名为与原始表相同

    如何创建新表:

    CREATE TABLE detail_table_1 AS
    SELECT id,
      REGEXP_REPLACE(source_num, '.', 'x', 7) AS source_num,
      REGEXP_REPLACE(destination_num , '.', 'x', 7) AS destination_num 
    FROM detail_table
    

    【讨论】:

    • 亲爱的马吕斯,你写LENGTH(source_num -6)是什么意思?可能应该将其更改为 LENGTH(source_num )-6。在那种情况下它是错误的。请检查一下
    【解决方案2】:
    update detail_table 
      set source_num = rpad(substr(source_num, 1,6), length(source_num),'X')
         ,destination_num = rpad(substr(destination_num , 1,6), length(destination_num ),'X'); 
    

    destination_numsource_num 两列添加更新

    【讨论】:

      【解决方案3】:

      我觉得这个比较短:

      update detail_table
      set source_num = REGEXP_REPLACE(source_num, '.', 'x', 7);
      

      【讨论】:

        【解决方案4】:

        这里有一个重要的概念,只有 Marius 提到过,它是从头开始重新创建表,而不是更新现有的表。 update 生成撤消和重做,这需要大量的时间和资源。如果您有索引,则在更新表中的值时更新它们会增加更多开销。有很多讨论,例如在 AskTom 上,关于这个问题(以及这个建议 - 在这种情况下创建一个新表,而不是更新现有表)。您会看到它们总是提醒您记录表上可能存在的索引、触发器等,这样您就可以在创建新表后重新创建它们,删除旧表并将新表重命名为旧表名字。

        例如:https://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO::P11_QUESTION_ID:6407993912330

        然后,由于您有大量的行(在关系数据库术语中没有“记录”),最好不要使用正则表达式。 Michael 提供了一种非常有效的方法,仅使用标准字符串函数即可获得所需的结果。或者,如果您的所有输入字符串的长度相同,比如说十个字符(或者如果您真的不关心保留长度 - 一旦您掩盖“数字”,也许保留它们的原始长度无论如何都无关紧要)您甚至可以做一些事情像substr(source_num, 1, 6) || 'XXXX' - 将重复调用保存到length()rpad(),表中的每一行对应一个。

        【讨论】:

          【解决方案5】:

          如果您的最终目标是隐藏数据,那么自 11gR2 以来可用的 Oracle 编辑功能是一项非常强大和高级的功能,但它是在高级安全功能下获得许可的,这将确保不需要的用户无法看到不需要的数据或看到部分数据。

          如果您需要更多详细信息,请告诉我。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-03-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-02-18
            相关资源
            最近更新 更多