2013-05-19 53 views
0

我写这个触发器监视一个名为employees的表,当从该表中删除一个雇员的触发器应该触发,并复制员工我们想从表中员工删除,并把另一个表称为deleted_employees,但是当我把下面的SQL语句从 员工删除WHERE雇员= 100 SQL错误说:如何写一个触发器来移动数据我想从表中删除它到antother删除它之前

Error starting at line 17 in command: 
delete from employees where employee_id = 100 
Error report: 
SQL Error: ORA-02292: integrity constraint (HR.DEPT_MGR_FK) violated - child 
         record found 
02292. 00000 - "integrity constraint (%s.%s) violated - child record found" 
*Cause: attempted to delete a parent key value that had a foreign 
      dependency. 
*Action: delete dependencies first then parent or disable constraint. 

CREATE OR REPLACE TRIGGER EMPLOYEE_DELETED 
    BEFORE DELETE ON EMPLOYEES 
DECLARE 
    CURSOR CUR_EMP IS 
    SELECT EMPLOYEE_ID , FIRST_NAME , LAST_NAME , EMAIL , 
      PHONE_NUMBER , HIRE_DATE , JOB_ID , SALARY , 
      COMMISSION_PCT , MANAGER_ID , DEPARTMENT_ID 
     FROM EMPLOYEES; 
    EMP_REC CUR_EMP%ROWTYPE; 
BEGIN 
    OPEN CUR_EMP; 

    while(CUR_EMP%FOUND) LOOP 
    FETCH CUR_EMP INTO EMP_REC; 
    INSERT INTO deleted_employees 
     (EMPLOYEE_ID , FIRST_NAME , LAST_NAME , 
     EMAIL , 
     PHONE_NUMBER , HIRE_DATE ,job_id , salary , 
     COMMISSION_PCT , MANAGER_ID , DEPARTMENT_ID) 
    VALUES 
     (EMP_REC.EMPLOYEE_ID ,EMP_REC.FIRST_NAME ,EMP_REC.LAST_NAME , 
     EMP_REC.EMAIL , EMP_REC.PHONE_NUMBER , EMP_REC.HIRE_DATE , 
     EMP_REC.JOB_ID , EMP_REC.SALARY , EMP_REC.COMMISSION_PCT , 
     EMP_REC.MANAGER_ID , EMP_REC.DEPARTMENT_ID); 
    END LOOP; 

    CLOSE CUR_EMP; 
END; 

我不知道如何测试触发器,有什么想法?!

+0

你的错误与触发器无关(不是说触发器是正确的没有双重检查,循环有点奇怪)。您试图删除在外键中引用的行;你不能因为它违反了数据库的完整性。 – Ben

+0

那么我能做些什么来解决它。 –

+0

您需要找出哪些数据依赖于您首先要删除的内容。如果你不想要数据,那么在删除你的内容之前删除它。如果你确实想保留这些数据,那么不要删除任何东西...... – Ben

回答

1

我观察到的一件事是,您错误地将EMPLOYEE表中的所有记录插入到DELETED_EMPLOYEES中。

我想你想插入雇员的详细信息到deleted_employee表,这是目前在删除行动。

在Oracle中,您可以使用:OLD关键字来引用当前运行记录。 好,如果你想删除相关记录智利以及..然后你可以在这个触发器本身做的,没有任何问题 -

CREATE OR REPLACE TRIGGER EMPLOYEE_DELETED 
BEFORE DELETE ON EMPLOYEES 
FOR EACH ROW 
DECLARE 
BEGIN 
INSERT INTO deleted_employees 
(
EMPLOYEE_ID , FIRST_NAME , LAST_NAME , EMAIL , 
PHONE_NUMBER , HIRE_DATE ,job_id , salary , 
COMMISSION_PCT , MANAGER_ID , DEPARTMENT_ID 
) 
VALUES 
(:OLD.EMPLOYEE_ID ,:OLD.FIRST_NAME ,:OLD.LAST_NAME , :OLD.EMAIL , 
:OLD.PHONE_NUMBER , :OLD.HIRE_DATE , :OLD.JOB_ID , :OLD.SALARY , 
:OLD.COMMISSION_PCT , :OLD.MANAGER_ID , :OLD.DEPARTMENT_ID); 

DELETE from DEPARTMENT where EMPLOYEE_ID = :OLD.EMPLOYEE_ID; -- If you are deleting child record then you will not get ORA:02292 error 

END; 

正是在这种触发按您的数据库编辑delete一部分。

为此,您需要首先检查关键约束DEPT_MGR_FK。 我猜想这个密钥存在于EMPLOYEE_ID列的DEPARTMENT表中。

所以检查这个键,并改变第二行,然后编译。

+0

你是指在单词END前的最后一行,从员工删除的权利? –

+0

@LaraDax看起来你有名为'DEPT_MGR_FK'的外键。只需检查这个关键约束。我猜想这个键在EMPLOYEE_ID的'Department'表上。如果是这样的话,你可以从'Department'表中删除相应的数据。**在从Employee'表中删除**之前。 –

+0

当我写下这条语句时:删除DEPARTMENTS所在---- etc;触发器变得无效? –

相关问题