我有三张桌子:
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”。
由于
答案 0 :(得分:2)
首先,CustomerHistory
表也可能包含CustomerId
,因此可以将历史记录追溯回适当的客户。
您需要两个触发器:一个在CustomerAccountManagers
上,另一个在Customers
上。如果你可以保证它们的执行顺序就没问题了:第一个触发器将插入,第二个触发器更新历史记录。
如果您无法保证订单,事情会变得复杂,因为每个触发器都必须:1)尝试插入新记录,并且失败2)更新现有记录。您必须保护自己免受另一个触发器的间歇性插入,这可能意味着在具有可序列化隔离级别的事务中运行(锁定整个表)。这很容易出现死锁,因此最好使用两个历史表,正如其他人已经建议的那样。
答案 1 :(得分:0)
您应该为每个普通表提供不同的历史表。 然后,您可以在每个普通表中放置一个触发器。
最后,如果需要,您可以创建一个加入不同历史表的视图CustomerHistory
。
答案 2 :(得分:0)
您需要将触发器添加到表中,其中数据更改将“触发”需要执行某些操作。
因此,当ManagerId发生更改时,Customers表上的触发器可跟踪CustomerAddress更改和CustomerAccountManagers上的触发器。