Sql 强制使用外键的触发器

Sql 强制使用外键的触发器,sql,database,plsql,plsqldeveloper,Sql,Database,Plsql,Plsqldeveloper,我有一个表名服务(产品、loca、从\u代理到\u代理) 产品参考产品(pno) 来自代理参考客户(cno)司机(drno)航空公司(Ano) to_代理referencesCustomer(cno)U Driver(drno)U Airline(ano) cno=Customer Number这是另一个表名“Customer”,其中包含名称、地址等其他详细信息 drno=Driver Number这是另一个表名“Driver”,其中包含其他详细信息,如名称、地址等 ano=Airline Nu

我有一个表名
服务(产品、loca、从\u代理到\u代理)

产品
参考
产品(pno)

来自代理
参考客户(cno)司机(drno)航空公司(Ano)

to_代理
references
Customer(cno)U Driver(drno)U Airline(ano)

cno=Customer Number
这是另一个表名“
Customer
”,其中包含名称、地址等其他详细信息

drno
=
Driver Number
这是另一个表名“
Driver
”,其中包含其他详细信息,如
名称、地址等

ano
=
Airline Number
这是另一个表名“
Airline
”,其中包含其他详细信息,如
出口、出口时间、到达时间等


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

解决这类需求的公认做法是而不是编写存储过程代码来强制执行引用完整性。无论它写得多么好,如果你继续这样一个解决方案,你已经失败了

您已经失败了,因为这样的解决方案要么最终总是失败并导致数据完整性问题,要么编写得非常有效以确保始终成功,但它需要一个分布式事务,该事务将有力而低效地锁定所涉及的表,从而使您产生并发会话性能噩梦

公认的做法是使用数据库平台的健壮、经过良好测试的高性能复制功能,然后按照惯例通过唯一键和外键建立引用完整性,让数据库做它所做的事情比编写存储过程代码来强制引用完整性要好数千倍


每个认真的数据库开发人员都会在某个时间点尝试自己的复制,除了最简单的情况外,他们总是失败得很惨。

为什么不需要真正的外键约束呢。因为我希望用户都提到存储在远程位置的数据片段的名称和位置。我在做分布式数据库,并有数据片段和存储在不同的位置