2013-10-10 3 views
0

각 직원이 다른 직원의 fk로 표시되는 관리자 (oracle SQL)가있는 테이블이 있습니다. 직원을 삭제할 때 관리자 필드에 자신의 키가있는 모든 직원이 관리자를 null (또는 -1 또는 예약 된 값)로 변경하는 트리거를 만들고 싶습니다. 현재 코드에서 무엇이 잘못되었는지 알아 내는데 어려움을 겪고 있습니다.오라클 트리거시 컴파일 오류

편집 : 나는 대부분의 코드를 수정했으며, 잘못된 길로 가고있었습니다. 나는 제안 된 ON DELETE 옵션을 사용했으며 이제는 모든 것이 잘 동작한다. 내 코드는 다음과 같습니다.

CREATE TABLE EmployeeA 
(
    employeeID integer, 
    firstName varchar (255), 
    lastName varchar (255), 
    phone integer, 
    jobTitle varchar (255), 
    payGrade integer, 
    fk_EmployeeemployeeID integer, 
    PRIMARY KEY(employeeID), 
    FOREIGN KEY(fk_EmployeeemployeeID) REFERENCES EmployeeA (employeeID) ON DELETE SET NULL 
); 
INSERT INTO EMPLOYEEA VALUES (1, null, 'Powell', 0, 'President', 100, 1); 
INSERT INTO EMPLOYEEA VALUES (2, null, 'Hicke', 0, 'Dean (Natural Science)', 100, 1); 
INSERT INTO EMPLOYEEA VALUES (3, null, 'Fenves', 0, 'Dean (Engineering)', 100, 1); 
INSERT INTO EMPLOYEEA VALUES (4, null, 'Porter', 0, 'Chairman (Computer Science)', 100, 2); 
INSERT INTO EMPLOYEEA VALUES (5, null, 'Beckner', 0, 'Chairman (Mathematics)', 100, 2); 
INSERT INTO EMPLOYEEA VALUES (6, null, 'Miranker', 0, 'Professor (Computer Science)', 100, 4); 
INSERT INTO EMPLOYEEA VALUES (7, null, 'Mok', 0, 'Professor (Computer Science)', 100, 4); 
DELETE FROM employeeA WHERE lastName = 'Porter';  
+0

로 설정됩니다 오라클은 당신이 그것을에 트리거 같은 테이블을 업데이트 할 수 없습니다 뿌려줍니다. 왜 새 레코드를 업데이트하지 않습니까? –

+0

우리는 새 레코드에 신경 쓰지 않아야합니다. 새 레코드는 새 관리자 행이지만 관리자에게보고하는 직원이 관리자 필드를 null로 설정해야합니다. – zaloo

+0

방아쇠를 사용해야하는 숙제입니까? 아니면 외래 키의'on delete' 속성을 사용할 수 있습니까? –

답변

1

여기서 트리거를 사용하지 않으려합니다. 외래 키의 on delete 속성을 사용하십시오. 외래 키 제약 조건을 정의 할 때 부모 행이 삭제 될 때 자식 행을 NULL으로 설정하도록 지정할 수 있습니다.

SQL> ed 
Wrote file afiedt.buf 

    1 create table employee2(
    2 employee_id number primary key, 
    3 manager_id number, 
    4 employee_first_name varchar(30), 
    5 constraint fk_manager_emp 
    6  foreign key(manager_id) 
    7  references employee2(employee_id) 
    8  on delete set null 
    9*) 
SQL>/

Table created. 

우리는 보스 (보스에게보고) 관리자, 및 (관리자에게보고) 직원 우리는 관리자, 직원의 manager_id을 삭제 한 후

SQL> insert into employee2(employee_id, manager_id, employee_first_name) 
    2 values(1, null, 'Boss'); 

1 row created. 

SQL> ed 
Wrote file afiedt.buf 

    1 insert into employee2(employee_id, manager_id, employee_first_name) 
    2* values(2, 1, 'Emp1') 
SQL>/

1 row created. 

SQL> ed 
Wrote file afiedt.buf 

    1 insert into employee2(employee_id, manager_id, employee_first_name) 
    2* values(3, 2, 'Emp2') 
SQL>/

1 row created. 

를 추가하는 경우 자동으로 당신이 그것을 컴파일 될 수있는 경우에도 다른 오류를 얻을 것이라고 생각 NULL

SQL> delete from employee2 
    2 where employee_first_name = 'Emp1'; 

1 row deleted. 

SQL> select * 
    2 from employee2 
    3 where employee_first_name = 'Emp2'; 

EMPLOYEE_ID MANAGER_ID EMPLOYEE_FIRST_NAME 
----------- ---------- ------------------------------ 
      3   Emp2