在删除所有记录并将其重新加载到SSIS中之前,请备份表

时间:2019-01-03 17:12:42

标签: sql-server ssis etl

  • 我有一个名为 abcTbl 的表,其中的数据已填充 来自不同数据库的其他表。每次加载时 数据到 abcTbl ,我正在将其全部删除并加载缓冲区 数据导入其中。
  • 该软件包每天运行。我的问题是如何避免丢失数据 如果我们无法将数据加载到表 abcTbl 中,请执行以下操作。所以我的 第一步是删除 abcTbl 中的所有数据,然后 从各种来源选择数据到缓冲区中,然后 将缓冲区数据加载到 abcTbl
  • 由于我们会遇到失败的连接,包装等问题 过早地停止,超自然力量试图阻止/破坏我的 程序包无法顺利运行等,最终会导致 打包后我已经丢失了缓冲区中的所有数据 从 abcTbl 中删除了数据。
  • 我的第一个直觉是将数据从 abcTbl 保存到
    备份表,然后删除 abcTbl 中的数据,但我的DBA 为每个备份表创建备份表不会太激动
    这个包装的环境,给我喝果汁
    快速创建备份表,然后再次将其删除 这个问题也是。此数据不是关键业务,可以重新填充 如果丢失,再次出现。

但是,这里最好的方法是什么?此问题的最佳做法是什么?

3 个答案:

答案 0 :(得分:0)

试图弄清楚这一点,但是我认为您要提供的是在加载新数据之前捕获较旧数据的方法。我同意您的DBA的观点,即每次重新加载都使用单独的表会非常混乱,并且如果您需要它的话也不会非常有用。
相反,创建一个表来复制您的加载表,但添加一个DateTime字段(例如history_date)。每次加载时,您只需将主表中的所有数据流到备份表即可。在数据流中使用派生列任务将history_date值添加到备份表中。
备份表完成后,请截断或删除当前表的内容。然后加载新数据。

答案 1 :(得分:0)

可以将包设置为作为单个事务执行,而不是创建其他表。这样,如果任何组件发生故障,所有已执行的任务将被回滚,后续的任务将不会运行。为此,请在包装上将TransactionOption设置为Required。这将允许包开始交易。之后,将要一起成功或失败的所有组件的所有此属性设置为SupportedSupported级别将使这些任务加入父容器已经在进行中的事务(在这种情况下为包)。如果包中还有其他要独立于这些任务提交或回滚的组件,则可以将相关对象放在Sequence容器中,然后将Required级别应用于Sequence。需要注意的重要一点是,如果任何事物执行TRUNCATE,则访问截断对象的所有其他组件都需要将ValidateExternalMetadata选项设置为false,以避免已知的阻塞问题。是这个的结果。

答案 2 :(得分:0)

要备份表,您无需将数据从一个表(原始)加载到另一张表(备份),只需将原始表重命名为某种内容(备份表),然后像创建备份表一样再次创建原始表,上表,然后仅在成功加载数据后删除重命名的表。这样可以节省一些时间将数据从一个表传输到另一个表。您可能要根据数据/表结构等来测试哪种方法对您来说更快,但是我想提到的是,这也是实现此目的的方法之一。如果您在该表中有很多数据,下面的方法可能会更快。

sp_rename 'abcTbl', 'abcTbl_bkp';

CREATE TABLE abcTbl ;

在创建此表时,您可以保持与 abcTbl_bkp

相似的表结构

将新数据加载到 abcTbl

DROP TABLE abcTbl_bkp;