RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 991563
Accepted
Vladimr Vladimirovoch
Vladimr Vladimirovoch
Asked:2020-06-11 12:45:48 +0000 UTC2020-06-11 12:45:48 +0000 UTC 2020-06-11 12:45:48 +0000 UTC

如何组织跟踪数据库对象变化的过程

  • 772

有一个数据库,里面有表,如果有什么东西被写入到表中或者被删除了,那么这些更改就会被写入到表中TableChangeHistory。我的应用程序需要根据请求知道哪些表已更改并从更新的表中选择数据。表本身如下所示:

CREATE TABLE TABLECHANGEHISTORY
(
  TABLENAME     VARCHAR2(512 CHAR),
  MODIFIEDDATE  DATE,
  OBJIDS        VARCHAR2(4000 CHAR)
);

CREATE INDEX I_TCHIST_TNMODIFIED ON TABLECHANGEHISTORY (TABLENAME, MODIFIEDDATE);

在我的应用程序中,我提出这样的请求:

select to_char(max(modifieddate),'DD.MM.YYYY HH24:MI:SS') as lastmodifieddate,tablename 
from TableChangeHistory 
group by tablename;

结果,我得到了一组数据,其中我看到了哪些表已更改。我想过以某种方式玩时间,例如,查看今天、一个小时等的变化,但后来我丢失了在我向程序发出请求之前可能已经更改的数据并且没有落入时间段,所以我使用最大值。这里我有一个问题,如何记住这个查询已经存在的结果。例如,我第一次启动程序,我的查询给了我所有更改的表,我从这些表中卸载,然后我必须以某种方式从查询中保存这些数据,哪些表已更改(在我的情况下,在查询的输出,我得到一个数组),例如,如果 20 分钟后我再次按下按钮,请求会给我另一批更改的表,

如何跟踪和比较什么是旧的和什么是新的?

c#
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Best Answer
    0xdb
    2020-06-12T03:25:30Z2020-06-12T03:25:30Z

    如果不更改数据库,它将无法工作。


    TableChangeHistory最简单的方法是通过添加一个带有已查看更改标记的字段来修改已经存在的表:

    alter table TableChangeHistory add (viewed char (1) default 'n');
    

    然后可以将请求限制为仅那些尚未“看到”的更改:

    select tablename, max (modifieddate) lastmodiefed 
    from tablechangehistory
    where viewed = 'n'
    group by tablename
    ;
    

    处理请求后,应注意查看的记录:

    update tablechangehistory set
        viewed = 'y'
    where <tablename, modifieddate из только что просмотренного массива>
    ;
    
    • 3
  2. Артем Черепахин
    2020-06-11T15:00:18Z2020-06-11T15:00:18Z

    @Vladimr Vladimirovoch。为了能够查看更改的动态,您需要为需要此类信息的每个表制作日志记录表。那些。一个触发器挂在表上,当每条记录被插入/更改/删除时,它将每个更改写入另一个表(一条记录插入到日志中),并带有时间戳。日志会定期清除。

    • 1
  3. Akina
    2020-06-11T15:24:19Z2020-06-11T15:24:19Z

    方案(不关心语法)。

    创建表

    CREATE TABLE last_changes ( tablename VARCHAR,
                                ts_change TIMESTAMP,
                                ts_get TIMESTAMP,
                                PRIMARY KEY (tablename) )
    

    我们创建一个触发器来修复工作表更改的事实(或者更确切地说,接收更改历史表中此类更改的记录)

    CREATE TRIGGER fix_changes
    AFTER INSERT ON TableChangeHistory 
    AS
    MERGE INTO last_changes
    USING (UPDATED.*) 
    ON (tablename)
    WHEN MATCHED THEN     -- имя уже присутствует, обновляем
        UPDATE SET ts_change = UPDATED.ModifiedDate
    WHEN NOT MATCHED THEN -- имя отсутствует - вставляем
        INSERT (tablename, ts_changed, ts_get)
        VALUES (UPDATED.TableName, UPDATED.ModifiedDate, UPDATED.ModifiedDate)
    

    当需要获取有关已更改表的信息(或者更确切地说,只是此类表的列表)时,我们执行

    UPDATE last_changes 
    SET ts_get = CURRENT_TIMESTAMP
    WHERE ts_change >= ts_get -- только изменившиеся после предыдущего запроса
    RETURNING (tablename)
    

    像这样的地方...

    PS。如果多个模式/基础的表中的更改是固定的,则在 tablename 字段中我们写表的全名,指示模式/数据库。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5