在多用户sql数据库中保存用户所做更改的跟踪

在多用户sql数据库中保存用户所做更改的跟踪,sql,database,tsql,database-design,Sql,Database,Tsql,Database Design,我正在设计一个关系数据库。它有几个表,并且在应用程序级别上有多个用户。我需要知道对某个表的某个记录所做的更改,由哪个用户、哪个时间以及实际更改的内容。有一个用于保存用户信息的表,该表也包含在该行为中 我应该如何在SQL数据库设计中做到这一点,以便让用户看到他们中的哪一个进行了这些更改?您需要的是类似Wiki的版本控制。基本上,对于要保留版本的每个表,您都希望至少创建一个该表的副本,其中添加了您提到的字段(userid,当它被添加时)。这可能就是它的全部内容,只要您只需要跟踪更改即可。然后,在编辑

我正在设计一个关系数据库。它有几个表,并且在应用程序级别上有多个用户。我需要知道对某个表的某个记录所做的更改,由哪个用户、哪个时间以及实际更改的内容。有一个用于保存用户信息的表,该表也包含在该行为中


我应该如何在SQL数据库设计中做到这一点,以便让用户看到他们中的哪一个进行了这些更改?

您需要的是类似Wiki的版本控制。基本上,对于要保留版本的每个表,您都希望至少创建一个该表的副本,其中添加了您提到的字段(userid,当它被添加时)。这可能就是它的全部内容,只要您只需要跟踪更改即可。然后,在编辑之后,您只需在复制的表中创建当前行的备份,并将新行放入实际表中。通过这种方式,您可以(希望)添加版本控制,而不必接触现有的表示代码

如果您需要记录额外的操作,如创建新行和删除,那么它会变得有点棘手


如果您需要一个代码示例,只需查看一些Wiki(如

)的引擎盖。对于初学者,您可以查看sql server版本跟踪机制(行版本控制或行更改)。之后,您可以查看sql server审计功能。我认为sql server audit最适合您的需要

另一方面,如果您想进行ad hok版本控制,那么您不能转到触发器。想象一下,您必须为所有表创建用于插入、更新和删除的触发器。这是个坏习惯


我认为应该避免临时版本控制(性能下降且难以支持),但如果无法避免,我肯定会使用上下文信息来跟踪当前用户,然后我会尝试创建一些内容来读取表的模式,我将使用sql server更改跟踪机制获取更改,并将其存储在tablename、changeduser、changedtime、column、prevValue和newValue样式中。我不会为更改复制每个表。

听起来你想在该表上设置一个触发器,以便在该表发生更改时写入一些审核信息。我自己也想到了一些事情,但我不知道这有多有效。我的解决方案是:在同一个表中添加3个字段,其中一个字段将具有生成该表的用户的PK该更改,第二个是更改日期/时间,第三个是已更改记录的主键。这些字段将添加到同一个表中。这意味着每次用户要更改该表中记录的一个或多个字段的数据而不是更新命令时,我们都要插入一条新记录。你怎么想?这样你就可以随时知道最新的更改是谁和何时进行的,但只知道最新的更改。另外:它没有提供任何方法来知道在最新的更改之前行是什么样子的。如果你有足够的信息,那就说吧!通常,您希望将该信息(谁更改了哪一行以及何时更改)写入一个单独的审核表。这将允许您查看更改的历史记录(而不仅仅是最后一个),并允许您查看哪些行在给定的时间段内被多次修改。某些系统还将存储行在每次更改之前的值,以便理论上可以在需要时还原该行的每个状态。您可以下载、安装该行,并查看源文件和创建的数据库架构?想象一下,用户更新了同一记录的多个不同字段的数据。如果不复制整个表,我如何保留这些更改?例如,如果同一用户更改了两列,我会在“更改”表中添加两行,第一列中有一行数据,第二列中还有一行数据。。。它们都应该具有相同的uniqiue id(以便能够将所有更改绑定在一起)。但无论如何,为什么不使用sql server更改跟踪?我们谈论的所有这些问题都已经在那里解决了:它很好,但不幸的是我不能使用它。因为我让50到100个不同的用户使用这个应用。他们在应用程序级别上是不同的用户,但在SQL数据库级别上,他们都只是一个用户。因此,从我所读到的内容来看,我无法将其用于这个程序。好吧,这并不是一个大问题,因为如果您能够设法在dal层设置执行用户的上下文信息,那么就可以很容易地从SQL级别的存储过程或函数中获取这些信息,并相应地记录更改。我认为变更跟踪已经在处理这个问题了,如果你能在执行之前设置它的话。