用于维护修改历史记录的SQL触发器

时间:2011-10-05 06:45:21

标签: sql triggers

我有三张桌子:

Table1: Customers (CustomerId, Name, CustomerAddress)
Table2: AccountManagers(ManagerId, Name)
Table3: CustomerAccountManagers (CustomerId, ManagerId, Remarks)
Table4: CustomerHistory(CustomerAddress, ManagerId, Date)

CustomerHistory表用于存储对“CustomerAddress”或“ManagerId”所做的任何更改,例如CustomerAddress从“Address1”更新为“Address2”或者CustomerAccountManager从“Manager1”更改为“Manager2”。

我需要通过SQL Trigger将更改存储在CustomerHistory表中。问题是我应该在哪个表上触发?请注意,更改是同时对“客户”和“客户”表格进行的。 “CustomerAccountManagers”。

由于

3 个答案:

答案 0 :(得分:2)

首先,CustomerHistory表也可能包含CustomerId,因此可以将历史记录追溯回适当的客户。

您需要两个触发器:一个在CustomerAccountManagers上,另一个在Customers上。如果你可以保证它们的执行顺序就没问题了:第一个触发器将插入,第二个触发器更新历史记录。

如果您无法保证订单,事情会变得复杂,因为每个触发器都必须:1)尝试插入新记录,并且失败2)更新现有记录。您必须保护自己免受另一个触发器的间歇性插入,这可能意味着在具有可序列化隔离级别的事务中运行(锁定整个表)。这很容易出现死锁,因此最好使用两个历史表,正如其他人已经建议的那样。

答案 1 :(得分:0)

您应该为每个普通表提供不同的历史表。 然后,您可以在每个普通表中放置一个触发器。

最后,如果需要,您可以创建一个加入不同历史表的视图CustomerHistory

答案 2 :(得分:0)

您需要将触发器添加到表中,其中数据更改将“触发”需要执行某些操作。

因此,当ManagerId发生更改时,Customers表上的触发器可跟踪CustomerAddress更改和CustomerAccountManagers上的触发器。