假设我有以下架构:
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触发器还是遗漏了什么的正确方法? 另外,如果只有一名员工,请帮助我编写一个触发器以允许删除部门。将最后一名员工分配到人力资源部门。
答案 0 :(得分:0)
你关闭了。这个触发器将要做的是每次更新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执行某些操作,否则触发器将完成,更新语句将完成。 &#34; EMPLOYEE_BUR&#34;名称更适合最佳实践,这样您就知道它是什么。 &#34; BUR&#34; - &#34;每行更新之前&#34;
对于第二部分,您可以在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将触发,重新分配员工。如果删除语句已完成,则将允许更新,因为没有以前的部门。