Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 使用SSI将3年以上的记录从一个数据库(生产数据库)移动到另一个数据库(归档数据库)_Sql Server 2005_Ssis_Archive_Purge - Fatal编程技术网

Sql server 2005 使用SSI将3年以上的记录从一个数据库(生产数据库)移动到另一个数据库(归档数据库)

Sql server 2005 使用SSI将3年以上的记录从一个数据库(生产数据库)移动到另一个数据库(归档数据库),sql-server-2005,ssis,archive,purge,Sql Server 2005,Ssis,Archive,Purge,要求将3年以上的数据从生产数据库移动到存档数据库,并在移动后从生产数据库中删除这些记录,因此在任何时候,生产数据库都只有最后三年的记录 我想通过SSIS实现这一点,我读了很多关于数据归档的文章,但没有找到最好的方法 我是SSIS的新手 我想实现像这样的目标(在下面的链接中给出答案),附加条件是只移动那些超过3年的记录,然后删除这些记录 可接受答案的标准应包括: 可伸缩性 复杂性 故障处理 可靠性 您可以使用OUTPUT子句一次删除并返回要移动的数据 create table Producti

要求将3年以上的数据从生产数据库移动到存档数据库,并在移动后从生产数据库中删除这些记录,因此在任何时候,生产数据库都只有最后三年的记录

我想通过SSIS实现这一点,我读了很多关于数据归档的文章,但没有找到最好的方法

我是SSIS的新手

我想实现像这样的目标(在下面的链接中给出答案),附加条件是只移动那些超过3年的记录,然后删除这些记录

可接受答案的标准应包括:

  • 可伸缩性
  • 复杂性
  • 故障处理
  • 可靠性

您可以使用OUTPUT子句一次删除并返回要移动的数据

create table ProductionTable
(
    ValueDate   datetime        not null
    , Data      varchar(max)    not null
)

insert ProductionTable values ('20100101', '3 years ago')
insert ProductionTable values ('20130425', 'this year')
insert ProductionTable values ('20130426', 'this year')

delete ProductionTable
output deleted.ValueDate, deleted.Data
where ValueDate <= dateadd(year, -3, getdate())
创建表ProductionTable
(
ValueDate日期时间不为空
,数据varchar(最大值)不为空
)
插入ProductionTable值('20100101','3年前')
插入ProductionTable值('20130425','this year')
插入ProductionTable值('20130426','this year')
删除ProductionTable
输出deleted.ValueDate,deleted.Data

其中ValueDate创建2个OLE DB连接管理器。将它们命名为Production和Archive,并让它们指向正确的服务器和数据库。SSI使用这些CMs从数据库中推送和拉取数据

添加数据流任务。DFT是一种可执行文件,允许对数据进行逐行操作。双击数据流任务。进入后,将OLE DB源和OLE DB目标添加到画布。OLE DB源是数据的来源,而OLE DB目标提供插入电源

您想要实现的逻辑是一种方法,正如我在另一个答案中概述的那样

DELETE
    DF
OUTPUT
    DELETED.*
FROM
    dbo.DeleteFirst AS DF
WHERE
    DF.RecordDate > dateadd(y, 3, current_timestamp);
此查询将删除所有超过3年的行,并将它们推送到数据流中。在OLE DB源中,进行以下配置更改

  • 将连接管理器从
    Archive
    更改为
    Production
  • 将查询类型从“表或视图”更改为“查询”
  • 粘贴查询并单击“列”选项卡以仔细检查已解析的查询
  • 将OLE DB源连接到OLE DB目标。双击OLE DB目标并对其进行配置

  • 验证连接管理器是否为
    存档文件
  • 确保访问模式为“表或视图-快速加载”(名称近似值)
  • 您可能需要根据您的表设计检查Retain ID—如果您有identity列,那么如果您希望生产系统中的ID 10在归档系统中为ID 10,请检查它
  • 选择实际表格
  • 在“映射”选项卡上,确保所有列都已映射。它通过匹配名称自动完成这一任务,因此不应该出现问题
  • 如果不需要跨越实例,则可以将上述逻辑压缩为单个
    executesql任务

    DELETE
        DF
    OUTPUT 
        DELETED.*
        INTO
        ArchiveDatabase.dbo.DeleteFirst
    FROM
        dbo.DeleteFirst AS DF
    WHERE
        DF.RecordDate > dateadd(y, 3, current_timestamp);
    

    使用这种方法还需要注意的是,如果您有标识列,则需要提供一个显式的列列表,并打开和关闭identity\u INSERT属性。

    您考虑过表分区吗?您可以将旧记录移动到一个完全不同的磁盘上,并在同一个表中保留它们。在某些情况下,它也有助于提高性能。。。所有这些都没有SSIS包。

    感谢@billinkc为我花时间,并回答它的帮助,我对不同的特性(如可靠性、可扩展性、性能、故障处理)没有什么疑问,如果我通过编写单独的脚本(比如存储过程“SP_DBBackup”)来实现相同的解决方案,这些因素会产生怎样的影响与构建“SSIS”包不同,哪种解决方案可以提供更好的性能?为什么?嗨,谢谢你的建议,我确实考虑了“表分区”,但我不知怎么地害怕分区(我不知道:(),分区给我带来了不好的感觉,可能是我正处于编码的初始阶段,我现在不想搞砸自己了!!无论如何,谢谢你的建议!!那很好-我觉得它超出了你的舒适区,你认为你在维护它时可能会有问题,那么最好还是用你知道你能支持的东西。嗨@louie谢谢你的支持非常好的回答,这很有帮助…现在我有更大的事情要担心,我要问你一个非常愚蠢的问题…给你同样的任务(数据存档)你会做什么?你应该选择相同的“SSIS”解决方案,还是编写一个“存储过程”,为你做同样的事情。我想问的是“数据存档”的“SSIS”解决方案相对于经典的“存储过程”的优缺点。!!请你帮我弄清楚。!!我要找的标准是“Sca”不稳定性“复杂性”故障处理“我需要先澄清一件事:SSI和存储过程可以共存,实际上它们是相辅相成的。将SSI视为工作流引擎,将存储过程视为由引擎控制的工作单元。如果存储过程是Walther PPK(pistol)那么SSIS就是007了。继续詹姆斯·邦德的类比,SSIS的美丽(007)它受过良好的训练,能够掌握更多的武器,例如电子邮件、ftp、文件系统操作等等。希望我的解释有助于您的理解。手头的任务是可以在SQL本身内完成的,因此没有什么理由使用SSIS。我假设ProductionDB和ArchiveDB位于sam上e SQL Server。我会创建一个存储过程来捕获尽可能多的活动。将所有内容封装在一个存储过程中是一个非常强大的概念,因为它可以保持代码模块化,从而提高可伸缩性。由于带有OUTPUT子句的DELETE语句是一个原子操作,因此它也是可靠的。从复杂性来看,