【问题标题】:Trigger to enforce constraint that employee never change department触发强制员工从不更换部门的约束
【发布时间】:2015-08-14 04:40:06
【问题描述】:

假设我有以下架构:

DEPARTMENT (DepartmentName, BudgetCode, OfficeNumber, Phone)
EMPLOYEE (EmployeeNumber, FirstName, LastName, Department, Phone, Email)

现在我需要编写一个触发器来强制执行员工不能更改其部门的约束。

CREATE OR REPLACE TRIGGER department_fixed
BEFORE UPDATE ON EMPLOYEE
FOR EACH ROW
   WHEN (old.Department is not null)
BEGIN
    dbms_output.put('You can not change department');
END;
/

这是编写这个 oracle 触发器的正确​​方法还是遗漏了什么? 如果部门只有一名员工,请帮助我编写触发器以允许删除部门。将最后一名员工分配到人力资源部门。

【问题讨论】:

  • 这是怎么失败的?你试过了吗?此外,dbms_output 并不是通知用户他做错了什么的常规方式。
  • @tvm 这就是我要问的,什么是正确的方法。第二个触发是什么?

标签: oracle oracle11g triggers


【解决方案1】:

你已经接近了。这个触发器要做的是对 EMPLOYEE 表的每次更新,它会检查原始部门,如果它不为空,它会在屏幕上打印一些东西。我假设您允许更新其他字段,对吗?所以我的触发器看起来像这样:

CREATE OR REPLACE TRIGGER EMPLOYEE_BUR
BEFORE UPDATE ON EMPLOYEE
FOR EACH ROW
DECLARE

DEPT_EXCEPTION EXCEPTION; --Declare the exception
PRAGMA EXCEPTION_INIT(DEPT_EXCEPTION, -20002);
L_COUNT NUMBER

BEGIN
SELECT COUNT(*) INTO L_COUNT FROM DEPARTMENT D
WHERE D.DEPARTMENT=:OLD.DEPARTMENT;

IF (:OLD.DEPARTMENT <> :NEW.DEPARTMENT) AND (L_COUNT > 0) THEN
     RAISE DEPT_EXCEPTION;
END IF;
END;

.. 然后我在调用过程中处理 DEPT_EXCEPTION。您必须引发异常 - 或 - 使用 :NEW.DEPARTMENT 执行某些操作,否则触发器将完成并且更新语句将完成。 “EMPLOYEE_BUR”名称更多的是为了最佳实践,这样你就知道它是什么了。 "BUR" - "每行更新前"

对于第二部分,您可以在 DEPARTMENT 上设置一个触发器,该触发器在删除之前触发以确认删除,然后在重新分配员工之后触发:

CREATE OR REPLACE TRIGGER DEPARTMENT_BDR
BEFORE DELETE ON DEPARTMENT
FOR EACH ROW
DECLARE

DEPT_COUNT_EXCEPTION EXCEPTION;
PRAGMA EXCEPTION_INIT(DEPT_COUNT_EXCEPTION, -20003);
L_COUNT NUMBER;

BEGIN

SELECT COUNT(*) INTO L_COUNT FROM EMPLOYEE E
WHERE E.DEPARTMENT=:OLD.DEPARTMENT;

IF (L_COUNT > 1 ) THEN
    RAISE DEPT_COUNT_EXCEPTION;
END IF;
END; 

那么……

 CREATE OR REPLACE TRIGGER DEPARTMENT_ADR
 AFTER DELETE ON DEPARTMENT
 FOR EACH ROW

 BEGIN
    UPDATE EMPLOYEE
    SET DEPARTMENT='HR'
    WHERE EMPLOYEE=:OLD.EMPLOYEE;
 END;

因此,如果您要删除一个拥有多名员工的部门,触发器 2 会触发并引发异常,因此触发器 3 不会。如果触发器 2 正常完成,则触发器 3 将触发重新分配员工。如果删除语句完成,则允许更新,因为没有以前的部门。

【讨论】:

  • 第二个查询呢?我在构图时遇到问题:(
  • 抱歉!我没有看到我专注于代码的那部分。我已经编辑了一个潜在的解决方案。 :)
  • 哦,太好了 :) 最后一个我需要编写一个触发器系统来强制执行 M-M 关系。假设可以删除只有一名员工的部门。并且还需要将部门中的最后一名员工分配给人力资源部。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
相关资源
最近更新 更多