2011-10-05 94 views
3

我有三个表:SQL触发维护修改历史

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

的CustomerHistory表用于存储作出“CustomerAddress”或“经理ID”例如CustomerAddress从“地址1”更新任何变化“地址2“或者CustomerAccountManager从”Manager1“更改为”Manager2“。

我需要通过SQL触发器将更改存储在CustomerHistory表中。问题是,我应该在哪张桌子上放置触发器?请注意,这些更改同时对“客户”&“CustomerAccountManagers”这两个表进行。

感谢

+0

您可能会发现谷歌搜索技术实现4型渐变维度有益的(见不同类型在这里 - http://en.wikipedia.org/wiki/Slowly_changing_dimension) –

回答

2

首先,CustomerHistory表也应该包含CustomerId,以便历史记录可以追溯到适当的客户。

您需要两个触发器:一个在CustomerAccountManagers和一个在Customers。如果你能保证执行的顺序没问题:第一个触发器会插入,第二个更新历史记录。

如果你不能保证顺序,事情变得复杂,因为每个触发器必须:1)尝试插入一个新的记录,如若不然2)更新现有的。您必须通过另一个触发器来防止间歇性插入,这可能意味着在具有可序列化隔离级别的事务中运行(锁定整个表)。这是容易出现死锁的,所以最好使用两个历史表,正如其他人已经提出的那样。

+0

感谢@MaDa。 是CustomerHistory表有客户ID。 让我尽量保持变化在一个表中如果没有工作的话,我会尝试使用两个变化。 –

+0

@YaqubAhmad麻烦的是它会在系统开发,但会给你在生产麻烦,流量增加时。另外我不知道你的数据库是否允许交易和锁定触发器 - 确保它。 – MaDa

+0

+1好答案... – amelvin

0

你应该有你有每个正常表不同历史表。 然后你可以在每个正常表中放置一个触发器。

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

0

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

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