审核SQL Server中的数据并检索时间点数据的最佳实践

时间:2011-10-22 12:16:28

标签: sql sql-server tsql audit

我已经在数据库中做了一段时间的历史记录表,但从未付出过太多的努力或思考。我想知道那里的最佳做法是什么。

我的主要目标是记录特定日期的记录的任何更改。如果一天发生多次变更,则只存在一条历史记录。我需要记录记录更改的日期,当我检索数据时,我需要从特定时间的历史记录中提取正确的记录。例如,我有一个客户表,想要提取他们在特定日期的地址。我的Sprocs喜欢获取Cust详细信息将采用可选日期,如果没有传递日期,则返回最新记录。

所以这就是我在寻求建议:

我是否将历史记录表保留在同一个表中并使用逻辑删除标志来隐藏历史记录表?我通常不这样做,因为有些表可以改变很多并且有很多记录。我是否使用镜像主表的单独表格?我通常这样做。我应该只将更改记录放入历史表而不是当前表吗?在某个时间点提取正确记录的日期最有效的方法是什么,获取客户的每条记录< =日期传递,然后按最近的日期排序并占据最高位置?

感谢所有帮助......关于M

4 个答案:

答案 0 :(得分:3)

建议使用基于触发器的审核并为您需要审核的所有表创建触发器。

使用触发器,您可以完成每天不存储多个记录更新的要求。

我建议您查看为您生成触发器的ApexSQL Audit,并尝试对他们使用的触发器进行反向工程,存储表的外观等等。

这会给你一个良好的开端,你可以在那里工作。

免责声明:不隶属于ApexSQL,但我每天都使用他们的工具。

答案 1 :(得分:1)

我不是该领域的专家,但是一位优秀的SQL顾问曾告诉我,如果可以更改所有数据,通常使用相同的表是一个好的方法。否则原始表只包含核心非可变数据,历史表只包含可以更改的内容。

答案 2 :(得分:1)

你应该在managing bitemporal data上正确地阅读这篇文章。这种方法的好处是它能够以可审计的方式纠正历史数据。

我相信这将解决您对修改历史数据的担忧

答案 3 :(得分:0)

我一直使用this article中描述的审核表的修改版本。虽然它确实需要您转动数据以使其类似于表的本机结构,但它可以抵御对架构的更改。

您可以创建一个返回表的UDF,并接受表名(varchar)和时间点(datetime)作为参数。 UDF应使用审计(历史值)重建表,并在该日期为您提供有效值。时间。