在更新或删除 oracle 中 2 个表之间的 FK 约束后触发

Triggering after an update or delete on a FK constraint between 2 tables in oracle

我有以下表格:

create table emp_test_lucian as select employee_id,last_name,first_name,department_id from employees;
ALTER TABLE emp_test_lucian
ADD PRIMARY KEY (employee_id);

create table dept_test_lucian as select department_id,department_name from departments_copy;
ALTER TABLE dept_test_lucian
ADD PRIMARY KEY (department_id);

在这个表上我想执行不同的操作,例如:如果一个部门被删除(从 dept_test_lucian),我将删除 emp_test_lucian 中具有该部门 ID 的所有行和触发器.当使用以下代码声明 2 之间没有 fk 时,这可以正常工作:

CREATE OR REPLACE TRIGGER triger5
 BEFORE UPDATE or DELETE on dept_test_lucian
FOR EACH ROW
BEGIN
 IF DELETING then
  delete 
  from emp_test_lucian
  where department_id = :OLD.department_id;
 else if UPDATING('department_id') then
  UPDATE emp_test_lucian
  set department_id = :NEW.department_id
  where department_id = :OLD.department_id;
 END IF;
END IF;
END;
/

我可以在上面的代码中添加什么才能工作,即使我在 2 个表之间有一个 fk,如下所示:

ALTER TABLE emp_test_lucian
  ADD CONSTRAINT fk_dep_id FOREIGN KEY(department_id) REFERENCES dept_test_lucian(department_id);

the current code returns :
Error report:
ORA-00001: unique constraint (C##LABORATOR.SYS_C009994) violated
ORA-06512: at line 2
00001. 00000 -  "unique constraint (%s.%s) violated"
*Cause:    An UPDATE or INSERT statement attempted to insert a duplicate key.
           For Trusted Oracle configured in DBMS MAC mode, you may see
           this message if a duplicate entry exists at a different level.
*Action:   Either remove the unique restriction or do not insert the key.

你要弄清楚table是什么'parent',什么table是'child'。

在你的例子中:
- Parent: dept_test_lucian
- Child: emp_test_lucian

让我们调用 'dept_test_lucian':TableA
让我们调用 'emp_test_lucian':TableB

我得出这个结论是因为 TableB.department_id" 上有一个 CONSTRAINT 只能有一个存在的值 在 "TableA.department_id"

错误消息告诉您有一个 'primary key being vialated'。 你 table 的主键是:
- "TableA.employee_id"
- "TableB.department_id"

显然,您正试图在这些值已存在的列之一中插入一个值。 如果 "TableA.employee_id" 中已经存在“1”,您将收到此类错误。

我还在你的触发器中看到的是:
您有一个 BEFORE UPDATE 触发器。

因此触发器会查看 "TableA" (Parent) 上是否有更新。
然后您首先尝试更新 "TableB" (child)。
这可能很棘手,因为 "TableB.department_id" 只能具有存在于 "TableA.department_id" 中的值。
如果 "TableA.department_id" 中不存在新的 UPDATE 值,则无法在 "TableB.department_id"

中更新该值