触发强制外键

问题描述:

我有一个表名Service(product, loca, from_agent, to_agent)触发强制外键

product参考Product(pno)

from_agent引用Customer(cno) U Driver(drno) U Airline(Ano)

to_agent引用Customer(cno) U Driver(drno) U Airline(ano)

cno = Customer Number这是 “Customer” 具有这样as name, address

drno = 012的其他细节另一个表名这是另一种表名“Driver”,其具有其它细节,例如name, address

ano = Airline Number这是另一种表名“Airline”,其具有其它细节,例如depport, depttime,arrtime等。

想写一个将强制执行的触发器,在进行任何更改之前,将检查product表中的外键。假设本地映射透明。

+3

为什么你不想要一个* real *外键约束。 –

+0

,因为我希望用户提及存储在远程位置的数据片段的名称和位置。即时通讯分发数据库,​​并有数据片段和存储在不同的位置 – JamesBond

解决此类需求的公认做法是而不是编写存储过程代码以强制执行参照完整性。不管它写得多好,如果你继续这样的解决方案,你已经失败了。

您已经失败了,因为这样的解决方案最终总是会失败并导致数据完整性问题,或者写得非常有效以至于始终成功,但它需要一个分布式事务,从而大大低效地锁定涉及的表,你会有并发的会话表现恶梦。

公认的做法是使用数据库平台的稳健,经过充分测试的高性能复制功能,然后通过唯一键和外键传统建立参照完整性,让数据库执行它所做的工作比编写存储过程代码来执行参照完整性好几千倍。

在某个时间点,每个认真的数据库开发人员都在进行自己的复制,除非在最简单的情况下,他们总是失败惨败。