CREATE OR REPLACE TRIGGER 트리거명
BEFORE | AFTER (INSERT, UPDATE, DELETE)
ON 테이블명
REFERENCING NEW | OLD TABLE AS 테이블명
[ FOR EACH ROW ][ WHEN 조건식 ]
DECLARE
선언문
BEGIN
PL/SQL 코드
END;
OR REPLACE : 생성할 트리거와 같은 이름을 가지고 있어도 무시하고 새로운 것으로 갱신하는 것이므로 사용할 때 주의
AFTER : 테이블이 변경된 후에 트리거가 실행
BEFORE : 테이블이 변경되기 전에 트리거가 실행
NEW : 새로 추가되거나 변경된 후의 값에 트리거가 적용 (INSERT : 입력할 값, UPDATE: 수정할 값)
OLD : 변경 전의 값에 트리거가 적용 (UPDATE: 수정 전 값, DELETE: 삭제할 값)
[FOR EACH ROW [WHEN TRIGGER 조건]]
FOR EACH ROW 를 쓰면 row(행) 트리거를 생성하고 WHEN 조건을 주면 WHEN 조건에 만족하는 ROW(행)만 트리거 적용
즉,FOR EACH ROW를 안쓰면 statement(문장) 트리거 생성
문장(statement) 트리거는 트리거가 설정된 테이블에 여러 행이 변경되더라도 오직 한번만 실행 되는 트리거.
행(row) 트리거는 조건을 만족하는 여러 개의 행에 대해 트리거를 반복적으로 여러번 수행 하는 트리거.
예를들어,emp 테이블에 10명의 사원이있고, UPDATE emp SET 급여 = 급여 * 1.1; 이라는 문장이 실행되면 where조건이 없기때문에
10명의 급여가 모두 오르는데, 문장 트리거는 10명이 다 오르기전,오른 후 에 한번 딱 실행하는 트리거이고,
행(row) 트리거는 1명 오르기 전,후 에 실행하고 2번째 사원 오르기 전,후에 실행하고 총 10번을 실행하는 트리거.
따라서, 자신이 원하는 기능에 따라 원하는 트리거를 잘 선택해서 써야될듯.

CREATE OR REPLACE TRIGGER PREMIER_PLM.TT_PDM_PART_XM010
AFTER INSERT OR UPDATE OR DELETE
ON PREMIER_PLM.PDM_PART
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
BEGIN
IF INSERTING THEN
-- SKW 신규 품목 생성 시 XM010 생성
INSERT INTO XM010_TEST(COMPANYCD, APNO, APNONM, KINDCD,
USEYN,
LOGIN_ID,LOGIN_YMD, LOGIN_C)
VALUES (:NEW.CMPY_SN, :NEW.PART_NO, :NEW.PART_NM,:NEW.KIND_CD,
'Y',
:NEW.CREATE_ACC_NO,:NEW.CREATE_DATE, :NEW.CMPY_SN);
ELSIF UPDATING THEN
-- 단순 UPDATE
UPDATE XM010_TEST
SET APNONM = :NEW.PART_NM
, KINDCD = :NEW.KIND_CD
, LOGIN_ID = :NEW.UPDATE_ACC_NO
, LOGIN_YMD = :NEW.UPDATE_DATE
WHERE COMPANYCD = :NEW.CMPY_SN
AND APNO = :NEW.PART_NO;
ELSIF DELETING THEN
-- DELETE FROM XM010_TEST
-- WHERE COMPANYCD = :OLD.CMPY_SN
-- AND APNO = :OLD.PART_NO;
UPDATE XM010_TEST
SET USEYN = 'N'
, LOGIN_ID = :NEW.UPDATE_ACC_NO
, LOGIN_YMD = :NEW.UPDATE_DATE
WHERE COMPANYCD = :NEW.CMPY_SN
AND APNO = :NEW.PART_NO;
END IF;
END;
/