首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >只获得从Server 2005更改的内容

只获得从Server 2005更改的内容
EN

Database Administration用户
提问于 2015-12-29 19:08:04
回答 2查看 66关注 0票数 1

我们有一个17存储系统,在server 2005标准版和Windows 2003服务器上。我们目前有以下程序:

  1. 在每个存储区,我们都有一个SQL作业,它运行一个过程来填充1个表。过程首先截断表,然后从系统中插入。这是从我们商店营业到现在为止的记录,大约有200万张记录在这张桌子上。没有办法把它存档。
  2. 然后,我们有一个SSIS包,它每天晚上从商店的返回到内政部获取这个表数据。它的运行时间是4-7个小时,这取决于连接性,这在大多数情况下都是缓慢的。

我们希望做以下工作:

  1. 我们希望在商店中创建一个单独的表,它只记录每晚填充表所发生的更改(上面的步骤-1)。
  2. 这样,当SSIS包提取数据时,它不需要撤回200万条记录,而是只能撤回更改

由于Server 2005,我们不能使用MERGE命令,而且由于表被截断和插入,所以不能很好地进行复制。我们怎么才能把钱换回内政部呢?

谢谢你,希伦·帕特尔

EN

回答 2

Database Administration用户

回答已采纳

发布于 2015-12-29 19:27:01

我会将这个过程更改为更类似于以下内容。这不是最好的解决方案,但一开始并没有那么多好的选择。

导入数据进程: a) -删除昨天的表b) -将当前表重命名为*_yesterday c) -从系统导入到当前

在Store的Server中创建视图,该视图只返回当前表和_昨天表之间新的/不同的行。就像下面这样。

代码语言:javascript
运行
复制
SELECT Current.*
FROM Current
LEFT OUTER JOIN Yesterday ON Yesterday.PK = Current.PK (or list each field out seperately)
WHERE Yesterday.PK IS NULL (so the new ones)
OR ISNULL(Yesterday.Field1, '') <> ISNULL(Current.Field1, '')
<repeat>

2) -将数据移动到HQ )--使用创建的视图,只需跨越新记录(可能进入暂存表)。那就用合并?( HQ是SQL的更高版本吗?)将新更新的数据推入总部的数据副本。

票数 2
EN

Database Administration用户

发布于 2015-12-29 19:41:36

假设可以对所涉及的源表进行更改,则可能需要考虑向每个源表添加一个TIMESTAMP列,并使用该列跟踪已更改的行。每当任何列被修改时,服务器都会自动更新TIMESTAMP列。

举个例子:

代码语言:javascript
运行
复制
USE tempdb;

DROP TABLE dbo.T1;

CREATE TABLE dbo.T1
(
    T1_ID INT NOT NULL
        CONSTRAINT PK_T1
        PRIMARY KEY CLUSTERED
        IDENTITY(1,1)
    , SomeData VARCHAR(255)
    , T1_TS TIMESTAMP NOT NULL
);

INSERT INTO dbo.T1 (SomeData)
VALUES ('This is a test 1');
INSERT INTO dbo.T1 (SomeData)
VALUES ('This is a test 2');
INSERT INTO dbo.T1 (SomeData)
VALUES ('This is a test 3');
INSERT INTO dbo.T1 (SomeData)
VALUES ('This is a test 4');

SELECT *
FROM dbo.T1

CREATE TABLE dbo.T1_MergedRows
(
    T1_ID INT NOT NULL
    , T1_TS VARBINARY(8) NOT NULL
);

SELECT *
FROM dbo.T1 
WHERE NOT EXISTS (
    SELECT *
    FROM dbo.T1_MergedRows t1m 
    WHERE t1m.T1_TS = t1.T1_TS
    );

UPDATE dbo.T1_MergedRows 
SET T1_TS = T1.T1_TS
FROM dbo.T1_MergedRows t1m
    INNER JOIN dbo.T1 ON t1m.T1_ID = t1.T1_ID
WHERE t1m.T1_TS <> T1.T1_TS;

INSERT INTO dbo.T1_MergedRows (T1_ID, T1_TS)
SELECT t1.T1_ID
    , t1.T1_TS
FROM dbo.T1
WHERE NOT EXISTS (
    SELECT *
    FROM dbo.T1_MergedRows t1m 
    WHERE t1m.T1_TS = t1.T1_TS
    );


SELECT *
FROM dbo.T1 
WHERE NOT EXISTS (
    SELECT *
    FROM dbo.T1_MergedRows t1m 
    WHERE t1m.T1_TS = t1.T1_TS
    );

UPDATE dbo.T1 
SET SomeData = 'This is not a test'
WHERE T1.T1_ID = 3;

SELECT *
FROM dbo.T1 
WHERE NOT EXISTS (
    SELECT *
    FROM dbo.T1_MergedRows t1m 
    WHERE t1m.T1_TS = t1.T1_TS
    );

以上4条SELECT语句的结果如下:

正如您在上面的图像中所看到的,最后一个select语句只返回已修改的行。所以这方面的工作流程是:

  1. 一整天都会插入/更新/删除行。
  2. 夜间进程运行此操作以获得新的/修改过的行:

SELECT * FROM dbo.T1 WHERE NOT EXISTS ( SELECT * FROM dbo.T1_MergedRows t1m WHERE t1m.T1_TS = t1.T1_TS );

  1. 更新T1_MergedRows表:

UPDATE dbo.T1_MergedRows SET T1_TS = T1.T1_TS FROM dbo.T1_MergedRows t1m INNER JOIN dbo.T1 ON t1m.T1_ID = t1.T1_ID WHERE t1m.T1_TS <> T1.T1_TS;

INSERT INTO dbo.T1_MergedRows (T1_ID, T1_TS) SELECT t1.T1_ID , t1.T1_TS FROM dbo.T1 WHERE NOT EXISTS ( SELECT * FROM dbo.T1_MergedRows t1m WHERE t1m.T1_TS = t1.T1_TS );

如果需要跟踪删除,可以修改T1_MergedRows表以包含IsDeleted位列,然后在导入行的过程中检查该列。在上面的步骤3中,您将更新T1_MergedRows表以设置IsDeleted位,如下所示:

代码语言:javascript
运行
复制
UPDATE dbo.T1_MergedRows 
SET IsDeleted = 1
WHERE NOT EXISTS (
    SELECT 1
    FROM dbo.T1
    WHERE T1.T1_ID = T1_MergedRows.T1_ID
    );

通过查看以下内容,夜间导入过程可以“查看”删除了哪些行:

代码语言:javascript
运行
复制
SELECT *
FROM dbo.T1_MergedRows
WHERE IsDeleted = 1;
票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/124799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档