如何在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中的数据编辑的文章,但提到它只是我们可以选择屏蔽数据但没有更新。
答案 0 :(得分:2)
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
答案 1 :(得分:1)
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_num
和source_num
答案 2 :(得分:1)
我认为这个更短:
update detail_table
set source_num = REGEXP_REPLACE(source_num, '.', 'x', 7);
答案 3 :(得分:0)
这里只有Marius所涉及的一个重要概念是从头开始重新创建表,而不是更新现有的表。 update
生成撤消和重做,这需要大量的时间和资源。如果您有索引,在更新表中的值时更新它们将增加更多的开销。有很多讨论,例如在AskTom上,关于这个问题(以及这个建议 - 在这种情况下创建一个新表,而不是更新现有的表)。您将看到它们总是提醒您记下表中可能存在的索引,触发器等,因此您可以在创建新表后删除旧表,删除旧表,并将新表重命名为旧表。名。
例如:https://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO::P11_QUESTION_ID:6407993912330
然后,由于你有很多行(在关系数据库术语中没有“记录”),所以最好不要使用正则表达式。迈克尔提供了一种非常有效的方法来使用标准字符串函数来获得所需的结果。或者,如果你的所有输入字符串都是相同的长度,比如十个字符(或者如果你真的不想保留长度 - 一旦你掩盖了“数字”,或许保留它们的原始长度无论如何都是无关紧要的)你甚至可以做某事例如substr(source_num, 1, 6) || 'XXXX'
- 保存对length()
和rpad()
的重复调用,表格中的每一行都有一个调用。
答案 4 :(得分:0)
如果您的最终目标是隐藏数据,那么Oracle修订功能是可用的,因为11gR2是一项非常强大的高级功能,但已获得高级安全功能的许可,这将确保不需要的用户将无法看到不需要的数据或看到部分数据。
如果您需要更多详细信息,请告诉我。