Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在sql server表中记录更改的数据。哪种方法更好_Sql Server_Database_Performance - Fatal编程技术网

Sql server 如何在sql server表中记录更改的数据。哪种方法更好

Sql server 如何在sql server表中记录更改的数据。哪种方法更好,sql-server,database,performance,Sql Server,Database,Performance,我只是想知道日志数据的修改 我已经了解了跟踪数据更改(DML)的方法 使用触发器 将添加日期、添加人、修改日期、修改人的列保留在同一表中 使用方法(1),我可以在每个表上编写Insert/Delete/Update触发器来记录更改,因此可以根据需要在所有表上应用外键关系和其他约束,如唯一键约束 但我不明白如何使用方法(2)应用各种约束。 因为我必须合成复合唯一密钥,必须考虑更多的列。 数据库表中是否存在任何设计问题。方法(2)记录数据的建议方法是什么 哪种方法更好 另外,我从我的一些同事那里了解

我只是想知道日志数据的修改

我已经了解了跟踪数据更改(DML)的方法

  • 使用触发器
  • 将添加日期、添加人、修改日期、修改人的列保留在同一表中
  • 使用方法(1),我可以在每个表上编写Insert/Delete/Update触发器来记录更改,因此可以根据需要在所有表上应用外键关系和其他约束,如唯一键约束

    但我不明白如何使用方法(2)应用各种约束。 因为我必须合成复合唯一密钥,必须考虑更多的列。 数据库表中是否存在任何设计问题。方法(2)记录数据的建议方法是什么

    哪种方法更好


    另外,我从我的一些同事那里了解到,触发器不会触发批量插入查询,这是真的吗?

    我最喜欢的解决方案是要求(如果可能,使用安全功能)所有应用程序数据访问(或至少所有CRUD操作)通过存储过程,并让SPs管理变更跟踪和审核

    触发器的问题是它们的伸缩性不好;通过将批处理插入或更新转换为许多单行操作,它们可以带来显著的性能影响

    至于是将更改保留在行中还是另一个表中,我倾向于使用另一个表。这样,我也可以在需要时有一个实际变化的历史记录,而不仅仅是谁和什么时候。保持源表的窄范围也有助于提高查询/读取性能


    您还可以对审计表应用分区,这将使它们在时机成熟时易于老化/删除。

    您缺少一个大的分区:。Sql Server Enterprise Edition已经内置了此功能。

    好问题,我已经看到/使用了这两种方法,但没有一种是正确的,我认为rdbms应该提供一些内置功能。在Sql Server 2008中,引入了一个新功能,即CDC“更改数据捕获”,它提供了相同的功能。但我担心的是以前的版本。CDC会告诉您更改了什么(包括实际数据),更改跟踪会告诉您哪些行发生了更改,但都不会告诉您是谁做的。审计可能是您避免触发的唯一内置功能,但它需要企业级。为你的2。如果不使用触发器,如何为临时更新捕获信息?默认情况下,在批量插入期间将忽略触发器,但有一个FIRE_触发器选项。这样做当然否定了使用批量插入的大部分好处,尤其是在触发器效率低下的情况下?这听起来一点也不理想。我宁愿把历史记录归档到别处,也不愿污染主表。谢谢。唯一的问题是,我们将根据客户的情况更改数据库服务器。所以,我们正试图尽可能减少对数据库服务器的依赖。但谢谢你提出这一点。