【发布时间】:2011-09-01 09:20:49
【问题描述】:
只是想了解日志数据修改。
我已经了解了跟踪数据更改 (DML) 的方法。
- 使用触发器
- 将添加日期、添加者、修改日期、修改者的列保留在同一个表中。
使用方法 (1),我可以在每个表上编写插入/删除/更新触发器以记录更改,因此可以根据要求在所有表上应用外键关系和其他约束,例如唯一键约束。
但我不明白如何使用方法 (2) 应用各种约束。 因为我必须制作复合唯一键并且必须考虑更多列。
数据库表中是否存在任何设计问题。方法(2)记录数据的建议方式是什么。
哪种方法更好。
另外,我从我的一些同事那里了解到,触发器不会在批量插入查询中触发,这是真的吗?
【问题讨论】:
-
好问题,我已经看到/使用了这两种方法,但似乎都不对,我认为 rdbms 应该提供一些内置功能。
-
在 Sql Server 2008 中,引入了一个新功能,即提供相同功能的 CDC“更改数据捕获”。但我担心以前的版本。
-
CDC 会告诉您发生了什么变化(包括实际数据),更改跟踪会告诉您哪些行发生了变化,但都不会告诉您是谁做的。审计可能是您唯一避免触发的内置功能,但它需要 Enterprise。对于您的 2. 如果您不使用触发器,您如何捕获临时更新的信息?
-
默认情况下,在 BULK INSERT 期间将忽略触发器,但有一个 FIRE_TRIGGERS 选项。这样做当然会抵消使用批量插入的大部分好处,特别是如果您的触发器效率低下。
-
所以您一直为每次更改保留一行?这听起来根本不是最佳选择。我宁愿在别处存档历史记录,也不愿污染主表。
标签: sql-server database performance