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을 사용했기 때문에 발생 했나요?
건배! :-)
당신 열을 지정하지 않는 다른 트리거가 있습니다. –
HR_EMPLOYMENT_DATA를 어떻게 업데이트하나요? 일종의 사용자 인터페이스를 통해 업데이트하는 경우 일부 열의 값만 변경된 경우에도 사용자 인터페이스가 모든 열을 업데이트 할 수 있습니다. 또한 AD_INTEGRATION을 최신 상태로 유지하기 위해 트리거를 사용하는 대신 필요에 따라 HR_EMPLOYMENT_DATA에서 값을 조회하기 위해보기를 사용하지 않는 좋은 이유가 있습니까? 트리거를 사용하여 올바르게 수행하기가 어렵습니다. HR_EMPLOYMENT_DATA에 삽입 및 삭제 트리거가 있습니까? AD_INTEGRATION에서 업데이트 및 삽입 트리거는 어떻게됩니까? –
예,보기를 사용하는 것이 최선의 선택이라고 생각되는 원인이되는 트리거가 있습니다. (왜 내가 전에 이것을 생각하지 않았습니까?) – Jaanna