Oracle 如何使用触发器从其他触发器继承值;“家长”;同表记录

Oracle 如何使用触发器从其他触发器继承值;“家长”;同表记录,oracle,inheritance,triggers,mutating-table,Oracle,Inheritance,Triggers,Mutating Table,我觉得这是甲骨文不想让我做的那种“只要你小心,你就能做到”的场景之一 我的问题是,我有一个配置表,我想通过触发器启用继承。设想一个员工表,其中有一个主管ID列,以及“继承的”主管名称,如果ID更改,该名称将自行填充 我想做一个简单的自查找,在INS/UPD时从另一行捕获一个值。但甲骨文拒绝承认这是一个变异的触发错误 我的代码基本上是: TRIGGER UPD_CHILD_RECORD BEFORE INSERT OR UPDATE ON MYSCHEMA.FAKE_EMPLOYEE FOR EA

我觉得这是甲骨文不想让我做的那种“只要你小心,你就能做到”的场景之一

我的问题是,我有一个配置表,我想通过触发器启用继承。设想一个员工表,其中有一个主管ID列,以及“继承的”主管名称,如果ID更改,该名称将自行填充

我想做一个简单的自查找,在INS/UPD时从另一行捕获一个值。但甲骨文拒绝承认这是一个变异的触发错误

我的代码基本上是:

TRIGGER UPD_CHILD_RECORD
BEFORE INSERT OR UPDATE
ON MYSCHEMA.FAKE_EMPLOYEE
FOR EACH ROW
WHEN (NEW.SUPERVISOR_ID IS NOT NULL)
BEGIN
IF INSERTING OR UPDATING
THEN
    :NEW.SUPERVISOR_NAME = (
        SELECT MAX(NAME)
        FROM MYSCHEMA.FAKE_EMPLOYEE
        WHERE EMPLOYEE_ID = :NEW.SUPERVISOR_ID
    );
END IF;
END UPD_CHILD_RECORD
;

谢谢。

这是正常的行为。Oracle保护您不受访问已更新表时可能获得的不一致数据的影响

想象一下这种情况。
您提交两个update语句,并有一个从同一个表中选择的触发器。让我们假设第一条语句已成功应用,并且数据已更改。现在是第二句话的时候了。您希望触发器中的select语句有什么输出?它应该返回第一次更新之前的数据,还是应该包含所做的更改?您可能认为Oracle应该返回新数据。但首先,Oracle并不真正了解您的意图,其次,这意味着您的查询依赖于行顺序,这与关系代数相矛盾

你的问题的解决办法很简单。您根本不需要
SUPERVISOR\u NAME
列。要获得主管的名称,只需将表本身连接起来并获得所需的结果,如:

从假员工t1中选择t1.ID、t1.SUPERVISOR\u ID、t2.NAME
左键连接t1上的假员工t2。主管ID=t2.ID;

只是一个旁白,但如果主管更改了姓名会发生什么?您必须更新引用该主管的每位员工。因此,是否有必要将此值复制到子行中?在选择时,在联接中获得主管名称不是更好吗?