2012-07-31 2 views
2

테이블의 일부 필드에 대한 트리거가 있습니다. 그러나 어떤 이유로 다른 필드가 변경되면 (트리거에서 정의되지 않은 경우) 여전히 트리거됩니다.하나의 테이블 필드에서 트리거가 모든 테이블 필드에 적용됩니다.

CREATE OR REPLACE TRIGGER INTEGRATION_EMPLOYMENT 
    AFTER UPDATE OF start_day_of_employment, end_of_employment ON hr_employment_data 
    FOR EACH ROW 
    DECLARE 
    BEGIN 
     IF UPDATING THEN 
      MERGE INTO ad_integration intg USING dual ON (intg.user_id = :NEW.user_id AND intg.integrated = 'NO') 
      WHEN MATCHED THEN 
       UPDATE SET 
         intg.start_day_of_employment = decode(:NEW.start_day_of_employment, NULL, ' ', :NEW.start_day_of_employment), 
         intg.end_of_employment = decode(:NEW.end_of_employment, NULL, ' ', :NEW.end_of_employment), 
         intg.manager_status = :NEW.manager_status, 
         intg.pid = (SELECT pid FROM arc.user_info WHERE user_id = :NEW.user_id), 
         intg.network_access_start_date = (SELECT network_access_start_date FROM hr_extension_data WHERE user_id = :NEW.user_id) 
      WHEN NOT MATCHED THEN 
       INSERT (intg.user_id, intg.start_day_of_employment, intg.end_of_employment, intg.manager_status, intg.pid, intg.network_access_start_date 
       VALUES (:NEW.user_id, :NEW.start_day_of_employment, :NEW.end_of_employment, :NEW.manager_status, (SELECT pid FROM arc.user_info WHERE user_id = :NEW.user_id), (SELECT network_access_start_date FROM hr_extension_data WHERE user_id = :NEW.user_id)); 
END IF; 

END HR_ADINTEGRATION_EMPLOYMENT; 

DUAL을 사용했기 때문에 발생 했나요?

건배! :-)

+0

당신 열을 지정하지 않는 다른 트리거가 있습니다. –

+2

HR_EMPLOYMENT_DATA를 어떻게 업데이트하나요? 일종의 사용자 인터페이스를 통해 업데이트하는 경우 일부 열의 값만 변경된 경우에도 사용자 인터페이스가 모든 열을 업데이트 할 수 있습니다. 또한 AD_INTEGRATION을 최신 상태로 유지하기 위해 트리거를 사용하는 대신 필요에 따라 HR_EMPLOYMENT_DATA에서 값을 조회하기 위해보기를 사용하지 않는 좋은 이유가 있습니까? 트리거를 사용하여 올바르게 수행하기가 어렵습니다. HR_EMPLOYMENT_DATA에 삽입 및 삭제 트리거가 있습니까? AD_INTEGRATION에서 업데이트 및 삽입 트리거는 어떻게됩니까? –

+0

예,보기를 사용하는 것이 최선의 선택이라고 생각되는 원인이되는 트리거가 있습니다. (왜 내가 전에 이것을 생각하지 않았습니까?) – Jaanna

답변

2

당신은을 구체적으로 필드를 변경하면, 다음 그냥 빨리가 비교합니까 같이 구조를 떠나지 만 트리거를 처리 할 경우 (새 코드 라인 7, 8) : 아마

CREATE OR REPLACE TRIGGER INTEGRATION_EMPLOYMENT 
AFTER UPDATE OF start_day_of_employment, end_of_employment ON hr_employment_data 
FOR EACH ROW 
DECLARE 
BEGIN 
    IF UPDATING 
     AND (:NEW.start_day_of_employment <> :OLD.start_day_of_employment 
     OR :NEW.end_of_employment <> :OLD.end_of_employment) THEN 
     MERGE INTO ad_integration intg USING dual ON (intg.user_id = :NEW.user_id AND intg.integrated = 'NO') 
     WHEN MATCHED THEN 
      UPDATE SET 
        intg.start_day_of_employment = decode(:NEW.start_day_of_employment, NULL, ' ', :NEW.start_day_of_employment), 
        intg.end_of_employment = decode(:NEW.end_of_employment, NULL, ' ', :NEW.end_of_employment), 
        intg.manager_status = :NEW.manager_status, 
        intg.pid = (SELECT pid FROM arc.user_info WHERE user_id = :NEW.user_id), 
        intg.network_access_start_date = (SELECT network_access_start_date FROM hr_extension_data WHERE user_id = :NEW.user_id) 
     WHEN NOT MATCHED THEN 
      INSERT (intg.user_id, intg.start_day_of_employment, intg.end_of_employment, intg.manager_status, intg.pid, intg.network_access_start_date 
      VALUES (:NEW.user_id, :NEW.start_day_of_employment, :NEW.end_of_employment, :NEW.manager_status, (SELECT pid FROM arc.user_info WHERE user_id = :NEW.user_id), (SELECT network_access_start_date FROM hr_extension_data WHERE user_id = :NEW.user_id)); 
END IF; 

END HR_ADINTEGRATION_EMPLOYMENT;