问题标签 [audit-trail]

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 投票
1 回答
232 浏览

sql - 如何使用带有 SQL 的审计跟踪来查找被破坏的数据行

我正在使用审计表来查找在“2011-01-01 08:00:00.000”上运行的单个破坏性 SQL 语句的记录。您可以假设每个 MyTable 记录在脚本运行的这一天只更新一次。此 SQL 可能由用户运行,无法检索。每次对 MyTable 进行更改时,新值的审计跟踪都会存储在 AuditMyTable 中。

我的原始表架构:

我的 MyTable 架构的审计跟踪表:

我的问题是如何从 AuditMyTable 针对自身编写 SQL 连接,以便我可以取回以下数据:

AuditMyTable.AccountId, AuditMyTable.Amount as [NullAmount], AuditMyTablePrevious.Amount as [PreviousNotNullAmount]

0 投票
3 回答
4380 浏览

c# - 实施审计的想法、技巧、工具和框架

我正在寻找想法、技巧、现有框架(基于 .NET)、工具以及您对实现良好审计跟踪的最佳方式的经验。

我们的典型应用程序没有什么花哨的 ASP.NET MVC 3-安全层-业务层-数据访问层-数据库(SQL Server 2008)

我唯一的要求是它必须易于实现并以某种方式存储在数据库中。

0 投票
1 回答
2596 浏览

asp.net - 如何在 Sql Server 中实现审计日志

我们有一个 (asp.net) 应用程序,它使用专门为此应用程序设置的登录凭据连接到 SQL Server 2008 R2 数据库。

我们的应用程序通过存储过程访问/修改/删除记录,我们将执行操作的用户的用户名作为参数传递给该存储过程。

我们需要能够保留某些表上所有更新和删除的审计日志。该解决方案还需要尽可能少,并且不需要任何开发人员干预。

我能找到的最简单的方法是在表 (A) 上放置一个触发器,将“旧”数据复制到历史表 (A_History) 问题是我们需要能够判断谁执行了该操作,以便更新这很容易,我们只需查看新插入记录的用户名。但是对于删除,我们无权访问发送到存储过程的用户名参数。

有没有办法在不使用 CONTEXT_INFO() 之类的东西的情况下实现这一点,因为这需要添加到每个存储过程和每个调用中,这一定会被遗忘。

0 投票
2 回答
802 浏览

php - 审核 MySQL 表并仅在批准后显示更改

我有一个带有几个表格的小型 Web 应用程序,用户可以在其中发布和编辑数据。我还有一个应用程序管理员来管理新发布或编辑的数据。我想做的是审核每个表并仅在管理员批准后才显示数据。

应用流程是这样的:用户在某个表中输入信息;管理员将被注意到,他将批准或拒绝该信息。如果批准,信息将显示在前端。一旦信息被批准,以后可以对其进行编辑。当用户编辑信息时,管理员再次被注意到,他必须批准或拒绝编辑的信息,但之前批准的信息必须在网站上仍然可用。

我还需要保留每个版本的更改信息(例如 v1、v2、v3 等)。

在您看来,完成这项工作的最佳方法是什么?

谢谢你。

0 投票
0 回答
158 浏览

database-design - 我想为表 xyz 创建一个历史表

可能重复:
在java中保留表的历史记录

你好,

如果用户在该特定表中插入、更新和删除,我想为表 xyz 创建一个历史表。我想将记录存储在历史表中,如旧值、新值、修改日期和修改用户。任何帮助都会非常感激。在此先感谢

0 投票
2 回答
557 浏览

sql-server-2008-r2 - 如何使用 Microsoft SQL Server LDF 文件进行审核?

我们需要在我们正在创建的产品中添加审核日志。我们使用 SQL Server 2008 R2。我了解到 LDF 文件保留了所有交易的完整日志*。

我找到了 ApexSQL Log,这个工具分析 LDF 文件并提供 GUI。这是对可能性的一个很好的展示。但它很贵。更多信息: http: //www.apexsql.com/sql_tools_log.aspx

你知道其他可以分析 LDF 文件的程序吗?或者也许其他提供审计跟踪功能的方法?我知道可以创建触发器。但是如果没有必要在我的数据库方案中添加东西,那么我宁愿不这样做。

*仅当您选择完全恢复模式时。

0 投票
11 回答
6703 浏览

java - 在java中保存表的历史

如果用户在该表上插入、更新和删除,我需要 Java 中的示例程序来保存表的历史记录。有人可以帮忙吗?

提前致谢。

0 投票
3 回答
813 浏览

c# - 如何跨两个 SQL Server 表检索审计跟踪并将它们按正确的顺序放回?

背景背景:


我有一个名为Project的数据库表和一个名为ProjectHistory的表,其架构相同。我正在使用 nhibernate,所以我还有一个名为Project的域对象和一个名为ProjectHistory的域对象(从Project派生)。

目标


我的目标是跨这些表检索数据,并将它们按发生的事件顺序放回原处,并让 C# 代码输出最后 n 次更改的典型审计跟踪屏幕

细节


两个表都有以下字段和数据类型

  • Id -(int)- Project 中的主键,注意:历史表中没有 PK
  • 上次更新(日期时间)
  • 名称(varchar)
  • 说明(varchar)
  • 时间戳(时间戳)

Projecthistory表的目标是,每当我对Project表进行更新时,ProjectHistory表都会插入一个带有旧记录的新行,这样我就可以获得完整的审计跟踪。

我通过使用此触发器来完成此操作:

我的问题是我现在需要一些 C# 代码来整理审核历史记录,其中用户选择最近的 n 个事件。

例子:


下面是一个事件示例:

  1. 1 月 10 日 - 创建项目 1(历史上还没有)
  2. 1 月 11 日 - 创建项目 2
  3. 1 月 15 日 - 编辑项目 2(将条目放入项目 2 的历史记录表中,其中 1 月 11 日的日期为最后更新日期)
  4. 1 月 25 日 - 编辑项目 1(将条目放入项目 1 的历史记录表中,日期为 1 月 10 日)

因此,正如您所看到的,如果我按历史表中的 lastupdated 字段降序排序,它将事件 4 的结果放在事件 3 的结果之前,这是无序的。

代码


我尝试了以下代码来尝试将它们组合在一起,但我将在下面解释该缺陷:

我对上述代码的主要问题是:

  1. 历史记录上的 LastUpdated 时间将反映上一个项目更新的LastUpdated时间,因此我无法对历史表中的该字段进行降序排序,并假设我将获得正确的事件降序。

    1. 我可以使用时间戳字段进行排序(因为那是输入记录的实际时间),但您似乎不能使用 C# nhibernate 对该字段进行排序,因为该字段只是一个二进制(8)所以它翻译到 C# 中不支持 IComparable 的 byte[]。
  2. 我可以在 Project 表上使用lastUpdated字段,因为按lastupdate字段排序可以让我按顺序获得最近发生的事件。我想过只遍历项目表,然后对每个项目进行单独的查询以获取最新的历史项目,但这不支持对同一项目 ID 进行多次更改的情况。问题是我无法找到以正确顺序获取数据的方法。

我的主要观点是,我想完成我认为必须解决的非常通用的事情,所以我一定只是错过了这里的基本模式。

我已经有代码可以将一个项目对象与另一个项目对象进行比较并返回字段差异(效果很好),但我只需要一个建议来弄清楚我如何以正确的顺序跨这些表从数据库中获取这些数据(无论是从我的查询还是事后的代码中),所以我可以显示“最后 n 次更改”,然后使用我的逻辑来显示每个更改的字段差异。

0 投票
9 回答
8111 浏览

sql - 保持参照完整性——好还是坏?

我们计划在我们的数据库中引入简单的审计跟踪,为需要审计的每个表使用触发器和单独的历史表。

例如考虑表 StudentScore,它有很少的外键(例如 StudentID、CourseID)将其链接到相应的父表(学生和课程)。

如果 StudentScore 需要审计,我们计划创建审计表 StudentScoreHistory -

如果 StudentScore 中的任何行被修改,我们会将旧行移至 StudentScoreHistory。

在设计讨论期间提出的要点之一是将 StudentHistory 表中的 StudentID 和 CourseID 设为 FK,以保持参照完整性。支持这一点的论点是因为我们总是执行软(逻辑布尔标志)删除而不是硬删除,这有助于保持引用完整性以确保我们在审计表中没有任何孤儿 ID。

这对我来说似乎有点奇怪。我同意@Jonathan Leffler 的评论,即审计记录不应停止删除父数据。相反,如果需要,应该通过主表中的外键而不是审计表中的外键来处理。我想听听你的意见,以确保我不会错过将外键扩展到审计表的一些价值。

现在我的问题是: 在历史表中包含这些外键是一个好的设计吗?

任何关于关键论点的细节(例如性能、最佳实践、设计灵活性等)都将受到高度赞赏。

为了任何寻求特定目的和我们环境的人的利益:

目的:

  1. 维护关键数据历史
  2. 允许审核用户活动并支持重新创建场景
  3. 在有限的范围内允许回滚用户活动

环境:

  • 事务数据库
  • 并非每个表都需要审核
  • 尽可能使用软删除,特别是针对静态/参考数据
  • 很少有高度事务性的表使用硬删除
0 投票
2 回答
815 浏览

database-design - 如何为聚合根创建审计跟踪?

我已经在线阅读了几篇文章以及 StackOverflow 上关于为数据库驱动的应用程序创建审计跟踪的几个答案。似乎最流行的解决方案是为有问题的表创建一个审计表,并使用触发器将审计记录插入到审计表中。

我可以看到这对于数据包含在一个表中的简单实体如何运作良好。

那么包含子节点的聚合根呢?

例子:

订单是包含许多订单行的聚合根,每个订单行在数据库中都有自己的表。假设每个数据库中还有一个审计表,当原始表发生更改时,它通过触发器接收更新:

现在,假设我们更改了某个订单的某些内容,但不更改其任何订单行。结果 tblOrders 被更新,并且触发器插入一个新的审计记录,反映对 tblOrdersAudit 的更改。但是,没有对 tblOrderLines 进行任何更改,因此 tblOrderLinesAudit 中没有匹配的审计记录。

一段时间后,我需要查看订单的早期状态,也许是为了回滚数据。我们如何匹配审计记录?