Sql server 如何在sql server表中记录更改的数据。哪种方法更好
我只是想知道日志数据的修改 我已经了解了跟踪数据更改(DML)的方法Sql server 如何在sql server表中记录更改的数据。哪种方法更好,sql-server,database,performance,Sql Server,Database,Performance,我只是想知道日志数据的修改 我已经了解了跟踪数据更改(DML)的方法 使用触发器 将添加日期、添加人、修改日期、修改人的列保留在同一表中 使用方法(1),我可以在每个表上编写Insert/Delete/Update触发器来记录更改,因此可以根据需要在所有表上应用外键关系和其他约束,如唯一键约束 但我不明白如何使用方法(2)应用各种约束。 因为我必须合成复合唯一密钥,必须考虑更多的列。 数据库表中是否存在任何设计问题。方法(2)记录数据的建议方法是什么 哪种方法更好 另外,我从我的一些同事那里了解
另外,我从我的一些同事那里了解到,触发器不会触发批量插入查询,这是真的吗?我最喜欢的解决方案是要求(如果可能,使用安全功能)所有应用程序数据访问(或至少所有CRUD操作)通过存储过程,并让SPs管理变更跟踪和审核 触发器的问题是它们的伸缩性不好;通过将批处理插入或更新转换为许多单行操作,它们可以带来显著的性能影响 至于是将更改保留在行中还是另一个表中,我倾向于使用另一个表。这样,我也可以在需要时有一个实际变化的历史记录,而不仅仅是谁和什么时候。保持源表的窄范围也有助于提高查询/读取性能
您还可以对审计表应用分区,这将使它们在时机成熟时易于老化/删除。您缺少一个大的分区:。Sql Server Enterprise Edition已经内置了此功能。好问题,我已经看到/使用了这两种方法,但没有一种是正确的,我认为rdbms应该提供一些内置功能。在Sql Server 2008中,引入了一个新功能,即CDC“更改数据捕获”,它提供了相同的功能。但我担心的是以前的版本。CDC会告诉您更改了什么(包括实际数据),更改跟踪会告诉您哪些行发生了更改,但都不会告诉您是谁做的。审计可能是您避免触发的唯一内置功能,但它需要企业级。为你的2。如果不使用触发器,如何为临时更新捕获信息?默认情况下,在批量插入期间将忽略触发器,但有一个FIRE_触发器选项。这样做当然否定了使用批量插入的大部分好处,尤其是在触发器效率低下的情况下?这听起来一点也不理想。我宁愿把历史记录归档到别处,也不愿污染主表。谢谢。唯一的问题是,我们将根据客户的情况更改数据库服务器。所以,我们正试图尽可能减少对数据库服务器的依赖。但谢谢你提出这一点。