问题标签 [audit-tables]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2745 浏览

hibernate - Hibernate 无法在删除时将 null 插入审计列

我最近在我的 user 和 user_audit 表中添加了一个新列“PASSWORD_RESET_REQUIRED”。

不是当我尝试删除用户时,我收到一条错误消息:

无法将 NULL 插入 ("USER_AUD"."PASSWORD_RESET_REQUIRED")

我的 UserDao 删除方法:

我可能会遗漏哪一部分?

0 投票
2 回答
2687 浏览

sql-server-2008 - 找出正在写入 SQL 表的应用程序以及何时写入

无论如何审计一个 SQL 表,您可以在其中获取信息,例如什么应用程序正在写入它以及它何时写入?

有一堆应用程序用户在这里使用,我已经梳理了每一个,找不到他们中的任何一个在 SQL Server 中写入这个表的位置。这是一张重要的桌子。

这让我疯狂。

0 投票
3 回答
1033 浏览

sql - SQL Server 审核同一张表中的数据

我正在处理的一个项目要求对记录进行数字“签名”,之后任何修改都会创建该行的新“版本”。出于监管原因,不能修改“签名”记录,并且不应该经常修改新版本。过去,这样做是通过创建一个与主表具有相同架构的单独日志记录表以及一些额外的列来跟踪谁修改它以及何时修改它。

但是,在使用 SharePoint 进行一些工作后,将所有数据(包括不同版本)放入同一个表中,我想到了一种不同的方法,我找不到任何人这样做的例子:我可以把新版本的行放在右边在同一个表中并增加版本号。然后将版本号添加到PK。

优点:

  • 实现很简单,只需创建一个“代替更新”触发器,它执行插入而不是更新行是“签名的”。我可以轻松地在触发器中添加要更新的 IsCurrentVersion 列。
  • 查询旧版本很容易,只需获取具有我想要的 ID 的所有记录,让用户从列表中选择。
  • 触发器很好,因为它保证如果签名后行不能被更新(出于监管和审计目的)。
  • 不必将表的模式更改复制到镜像“记录”表。

缺点:

  • 该表可能会变大一些,但大多数情况下,“签名”后记录不会更改。客户估计在当前使用水平下每年最多 100,000 行。SQL Server 可以处理数亿行,所以这看起来还不错。
  • 索引和性能可能是一个问题。SharePoint 将 tp_CalculatedVersion int 添加到 PK,其中最新版本的计算数字始终为 0。我可以做同样的事情并根据版本号计算它。这对性能有帮助吗?
  • 查询数据有一个额外的步骤,以确保您获得最新版本,但这可以在 SP 中处理。

  • 在这种情况下还有什么其他缺点。我错过了什么吗??

0 投票
2 回答
2620 浏览

mysql - 如何从 MySQL 表中获取相同 id 的最新时间戳记录?

可能重复:
获取列的最大值所在的行

我有一个人的审计表以及他们在特定时间戳拥有的股份数量。如何获取给定 ID 的最新记录?

mysql审计表

我想要的输出:

我可以做这样的事情:

但这只会给我那些重复的最新记录。在这种情况下,ID 为 1,2 而不是 3。如何在没有子查询或临时表的情况下获取所有 ID 的最新记录列表?

0 投票
2 回答
9838 浏览

mysql - 带有审计表的数据更改历史记录:分组更改

假设我想将用户和组存储在 MySQL 数据库中。他们有一个关系n:m。为了跟踪所有更改,每个表都有一个审计表 user_journal、group_journal 和 user_group_journal。MySQL 触发器在每次 INSERT 或 UPDATE 时将当前记录复制到日志表(不支持删除,因为我需要应用程序用户删除记录的信息——所以有一个标志active将被设置为0而不是删除)。

我的问题/问题是:假设我一次将 10 个用户添加到一个组中。当我稍后在应用程序的用户界面中单击该组的历史记录时,我希望将这 10 个用户的添加视为一个步骤,而不是 10 个独立的步骤。有没有很好的解决方案将这些更改组合在一起?也许每次触发器被触发时都会增加一个计数器?我从未使用过触发器。

最好的解决方案是将事务中所做的所有更改放在一起。因此,当用户更新组的名称并一步添加 10 个用户(一个表单控制器调用)时,这将是历史记录中的一步。也许可以在每次启动事务时定义一个随机散列或增加一个全局计数器并在触发器中访问该值?

我不想让表格设计比为每个“真实”表格拥有一个日记帐表格更复杂。我不想在每个数据库表中添加事务哈希(意思是“真实”表,而不是审计表——当然可以)。我也想在数据库中有一个解决方案——而不是在应用程序中。

0 投票
1 回答
2114 浏览

sql - 仅选择对审计日志表中值的更改

在 MS SQL Server 2008 R2 中,我有一个表 Foo,对于 Foo 的每次插入和更新,我还将日期、用户、PK FooId 和 Foo 的其他一些列插入到 FooAuditLog 中,包括一个数值,叫它cxp。

我现在需要检索给定 FooId 随时间变化的 cxp 更改历史记录。但是可以在不更改 cxp 的情况下保存 Foo,我需要忽略这些值。

例如,如果特定 Foo (ie select date, user, cxp from FooAuditLog where fooId=17) 的审核日志条目如下所示:

然后我需要修改查询以仅返回:

并忽略 11/7、11/9 和 11/14 的条目。我曾考虑过select distinct (cpx) ... group by date,但我确实需要捕获值变回先前值的条目。

0 投票
3 回答
389 浏览

ruby-on-rails - rails模型的影子表

我的 Rails 应用程序中有关注模型,当用户关注某些内容时 - 创建记录,取消关注 - 删除记录。

我需要在单独的表中跟踪此更改(仅插入和删除)。

它将用于使用普通 SQL 构建一些报告 - 这就是为什么表应该具有类似的结构,即“影子”

我不想用额外的逻辑来破坏原始模型 - 有一些解决方案,但它们不够灵活:

https://github.com/rubiety/has_draft - 我无法选择具体的操作

https://github.com/bglusman/ruby-shadow-tables - 仅限原始和 mysql

有人知道这种情况的一些好的解决方案吗?

0 投票
1 回答
997 浏览

java - 具有现有数据库触发器的 JPA 审计/历史数据

我正在将 JPA 应用程序添加到许多现有应用程序的复杂系统中(用 MS Access、Delphi、Perl、C#、PHP 等编写)。底层 MS-SQL 数据库使用数据库触发器将任何更改的数据库条目的副本写入历史数据库表中,添加SYSTEM_USERGETDATE().

由于我的新 JPA 应用程序使用连接池 - 数据库表的所有更改将始终由我们的技术用户(用户:“Java”)进行,并且 JPA 应用程序的所有历史数据库表条目将始终将“Java”作为 SYSTEM_USER。

如何让在历史表中自动创建条目-而不删除现有触发器?

我想过:

  1. 每当用户“Java”修改表并自己创建历史数据库表条目时,告诉现有触发器不要启动。因此,我必须为我的每个历史数据库表创建许多新的实体类。不是很方便。
  2. 禁用连接池并为每次修改创建单独的连接 - 使用实际用户连接到数据库。但这会有性能缺陷。而且我不知道如何禁用连接池。
  3. 使用临时表始终存储当前用户 - 数据库触发器在历史数据库表中创建条目时应使用该存储用户
  4. 操作后手动更改历史数据库表中的用户。
0 投票
1 回答
79 浏览

mysql - 在mysql表中记录列级别的变化

我的客户希望在列级别保持审计。他想要一个存储所有审计的表,即在列级别。我已经决定了一个表结构。IE

但我想知道如何检查每个列级别的更改。我是否必须像 old.columnname <> new.columnname 一样手动检查每一个,然后添加到审计表中?

有没有其他方法可以做到这一点。

0 投票
1 回答
112 浏览

sql - 从审计表中选择

我有下表

在列中 newvalue oldvalue 是来自其他表的值(外键)。我需要显示引用表中的其他列(即基于主键)。因此,在 select 而不是 newvalue 中,某些键将显示一些与键对应的列。我是新来的,所以如果您想进一步澄清我的问题,我会这样做。提前致谢。

编辑: 在第一个表中是列 entityID(来自审核表)、columnName、OldValue、NewValue

第二个表AddressId,city,street,ZIPCode。

在 colmns newvalue 的第一个表中,oldvalue 是来自第二个表的 PK。我需要显示例如老街、新街。