要求将数据从生产数据库移动到存档数据库3年以上,并且一旦移动从生产数据库中删除这些记录,因此在任何时间点生产数据库将只有最近三年的记录。
我希望通过SSIS实现这一目标,我阅读了很多关于数据存档的文章,但无法找出最好的Approch。
我是SSIS的新手
我希望达到类似这样的效果(在下面的链接中给出答案),附加条件是只移动那些超过3年的记录,然后删除这些记录。
https://dba.stackexchange.com/questions/25867/moving-data-from-one-db-to-another-using-ssis
接受答案答案的标准应该解决
答案 0 :(得分:1)
您可以使用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())
也可以在SQLFiddle
上访问该代码现在,我将向您展示在SSIS中需要遵循的具体步骤,以重现该示例:
希望它有所帮助。
要记住的其他事项,因为您正在删除和移动数据,事务一致性非常重要。想象一下,在删除/移动的一半时,服务器停止运行,然后最终将数据删除但不会将其存储到存档中。
如果您不确定如何通过强制执行事务一致性来保护数据,请向其他SQL / SSIS专家寻求有关如何在SSIS中使用事务的帮助。
答案 1 :(得分:1)
创建2个OLE DB连接管理器。将它们命名为Production和Archive,并将它们指向正确的服务器和数据库。这些CM是SSIS用来从数据库中推送和提取数据的。
添加数据流任务。 DFT是允许逐行操作数据的可执行文件。双击数据流任务。进入后,将OLE DB源和OLE DB目标添加到画布。 OLE DB源是OLE DB目标提供插入功能时数据来源的位置。
您想要实现的逻辑是Delete first方法,就像我在另一个答案中概述的那样。
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目标并配置它
Archive
如果您不需要跨越实例,可以将上述逻辑压缩为单个Execute SQL Task
DELETE
DF
OUTPUT
DELETED.*
INTO
ArchiveDatabase.dbo.DeleteFirst
FROM
dbo.DeleteFirst AS DF
WHERE
DF.RecordDate > dateadd(y, 3, current_timestamp);
另请注意,使用此方法时,如果您有标识列,则需要提供显式列列表并打开和关闭IDENTITY_INSERT属性。
答案 2 :(得分:0)
您是否考虑过表格分区?您可以将旧记录移动到完全不同的磁盘,并将它们保留在同一个表中。在某些情况下,它也有助于提高性能......所有这些都没有SSIS包。