我想清理(或加密)几张几年前的表格中的电子邮件信息。
这是我计划作为工作的一部分做的,下次当我运行该工作时,我怎样才能省略已经清理或加密的行。
我正在寻找一种性能良好的方法。
我想清理(或加密)几张几年前的表格中的电子邮件信息。
这是我计划作为工作的一部分做的,下次当我运行该工作时,我怎样才能省略已经清理或加密的行。
我正在寻找一种性能良好的方法。
“我想清理(或加密)几张几年前的表格中的电子邮件信息”
我希望这意味着您在这些表上有一个日期列,您可以使用它来确定哪些需要清除。处理这项工作的最有效方法是在操作表中跟踪该日期,记录最近清理的日期。
例如你有十年的数据,你需要清理超过四年的记录。现在这将起作用:
update t23
set email = null
where date_created < add_months(sysdate, -48);
但似乎你想批量处理。所以建立一个跟踪表,最简单的就是
create table tracker (
last_date_scrubbed);
last_date_scrubbed
用一个非常旧的日期填充说date '2010-01-01'
现在您可以编写这样的查询
update t23
set email = null
where date_created
< (select last_date_scrubbed + interval '1' year from tracker);
这将清除所有早于 2011 年的记录。将跟踪器表中的日期增加一年。再次运行查询以清理 2011 年以来的内容。重复直到达到目标清洁状态。此时,您可以切换到每月运行查询,使用interval
一个月或其他方式运行查询。
显然,您应该将此程序化。过程是封装这些步骤并确保一切都保持一致的最佳方式。您也可以使用数据库调度程序来运行该过程。
“这种方法有一个缺点。我认为您希望自由选择要更新的行。”
我没有看到任何要求跟踪哪些单独的行已被擦洗。毕竟,最终状态是每条早于某个日期的记录都已被清除。当我以前做过这样的工作时,所有人都想知道,“到目前为止,我们已经完成了多少行,我们还需要做多少行?” 可以通过跟踪sql%rowcount
每次运行来回答。
为了获得最佳性能,您可以在主表中添加一个标志列。像IsEncrypted
. 然后每次您尝试对“未加密的行”运行任何查询时,WHERE
当IsEncrypted
Column 为 false 时,您可以轻松地使用这些行仅作为条件。
不过还有其他方法。
编辑
另一种方法是创建一个记录器表。基本上这张表的作用是,它在另一个表中记录了你想要的关于某个 ID 的更多信息。有另一个名为 的表EncryptionLogger
,其中至少有两列:EmailTableId
, IsEncrypted
. 然后在任何查询中,您都可以简单地获取WHERE
它们Id
的任何行是NOT IN
这个表。