【发布时间】:2017-05-20 14:01:58
【问题描述】:
我正在使用 Oracle Express 12c。我创建的一个表有一个关联的触发器,它阻止它直接更新它的列之一。但即使当另一个应该具有这种访问权限的表尝试执行此操作时,它也会触发。
例如:
我有表 A 和 B,B 有一个将其链接到 A 的外键。我故意将其中一个属性从 A 添加到 B。一个触发器,我们称之为 UPD_FROM_B,阻止 B 更新此属性。另一个 UPD_FROM_A 应该在 B 上更新此属性,如果它在 A 上更新。现在 UPD_FROM_B 阻止 UPD_FROM_A 做它应该做的事情。
或者通过一个工作示例:
有两个表:customer 和 order。 客户可以有多个订单,但一个订单只有一个客户。为了项目,我不得不把 customer_name 放在订单上,即使每个订单都有 customer_id 作为外键。
一个触发器 - UPD_NAME_ORDER 阻止 order 更新 customer_name 和另一个 - UPD_NAME_CUST 在 customer_name 更新时更新 order 表的相应行中的此列在客户
如何确定哪个表触发了该操作并允许对其中一个表执行 UPDATE,但仍阻止另一个表执行?
【问题讨论】:
-
当你说一个表“试图做什么”是什么意思?你的意思是在另一个表上可能有另一个触发器试图更新你的表?请尝试发布minimal reproducible example 以帮助人们了解您的需求并给您答复,
-
我相信你无法确定是谁触发了你的触发器,但也许你会发现一些有趣的东西here
-
您的“示例”不清楚。哪个表拥有哪个触发器?基于对触发器如何工作的误解,您的示例听起来像是您正在考虑的假设;不是现有的场景。如果没有,则发布 DDL 或查询目录视图 ALL_TRIGGERS 以找出答案。
-
@mustaccio - 虽然我同意你在他的问题背景下的陈述,但你的陈述并不完全正确。 Oracle 支持特定列上的触发器以及使用触发器的 ON 和 WHEN 子句的更细粒度的强制逻辑,因此一个 UPDATE 可能会通过,而另一个可能不会。
-
@mustaccio - 来吧。如果你要迂腐和讽刺,至少是正确的。在指出您的错误陈述时,我试图保持礼貌。我所说的“上下文”的意思更多的是“出于他的问题的目的”,承认您的错误评论仍然适用于他。对不起,你有防守,但它仍然是不正确的。语句如果你有一个阻止更新语句的触发器,所有的更新语句都会被它阻止,这仍然是错误的。
标签: sql oracle plsql triggers oracle12c