1. 뷰를 만들면 갱신 가능/불가능 여부가 결정됩니다.
- 몇가지 제약사항을 만족한다면 갱신이 가능합니다.
- 복잡한 뷰나 이상한 함수 사용한 뷰가 아니라면? 단순 조회뷰라면? 갱신 가능합니다.
- 뷰에 작접 인서트/업데이트/딜리트가 가능하다는 말이죠.
- 뷰에 대한 갱신은 원본테이블에 직접적으로 가해집니다.
- 따라서 원본 테이블에 트리거를 걸면 됩니다.
- http://gurubee.net/lecture/1036
2. 타겟 테이블과 동일한 모양의 뷰를 만들고 싶다면?
- 원하는 결과를 출력하는 SELECT 구문 그대로 만들면 됩니다.
- 다만, 컬럼을 가공한다면 가공된 컬럼은 갱신이 안되겠지요?
ST: 소스테이블(ENO,ENAME,ETYPE), TT : 타겟테이블 (TNO, TNAME), VT: select ENO AS TNO, ENAME AS TNAME from ST where ETYPE='aa' 이런 구조로 만든 view 테이블.
아래는 일반적인 Trigger 형태 여기서 ST를 사용하지 않고 VT를 사용하고 싶습니다.
CREATE OR REPLACE TRIGGER TRG_TEST
AFTER INSERT OR UPDATE OR DELETE ON ST
FOR EACH ROW
DECLARE
EROLE VARCHAR2(100) := '';
BEGIN
IF INSERTING THEN
INSERT INTO TT (TNO, TNAME)
SELECT :NEW.ENO, :NEW.ENAME
FROM DUAL
ELSIF UPDATING THEN
UPDATE TT
SET TNAME= :NEW.ENAME
WHERE TNO= :OLD.ENO;
END IF;
END TRG_TEST;
=========================
아래 처럼 ST -> VT 로 변경시 ora-25001: 이 유형의 뷰에는 이 트리거 유형을 생성할 수 없습니다 오류나는거 같습니다.
CREATE OR REPLACE TRIGGER TRG_TEST
AFTER INSERT OR UPDATE OR DELETE ON VT
FOR EACH ROW
DECLARE
EROLE VARCHAR2(100) := '';
BEGIN
IF INSERTING THEN
INSERT INTO TT (TNO, TNAME)
SELECT :NEW.ENO, :NEW.ENAME
FROM DUAL
ELSIF UPDATING THEN
UPDATE TT
SET TNAME= :NEW.ENAME
WHERE TNO= :OLD.ENO;
END IF;
END TRG_TEST;
==========================================
ST는 그대로 사용하고 from dual 를 from VT 형태로 사용해야 되나요?
CREATE OR REPLACE TRIGGER TRG_TEST
AFTER INSERT OR UPDATE OR DELETE ON ST
FOR EACH ROW
DECLARE
EROLE VARCHAR2(100) := '';
BEGIN
IF INSERTING THEN
INSERT INTO TT (TNO, TNAME)
SELECT ENO,ENAME
FROM VT WHERE TNO = :NEW
ELSIF UPDATING THEN
UPDATE TT
SET TNAME= :NEW.ENAME
WHERE TNO= (SELECT TNO FROM VT FROM TNO = :OLD.ENO);
END IF;
END TRG_TEST;
=========================================
예가 잘 만들어졌는지... ㅜ.ㅜ view 테이블을 이용해서 Target에 데이터를 넣을려고 하는겁니다. 어떤 작업을 하려고 하는지 이해가 되시면 샘플 Trigger 하나 만들어 주시면 감사하겠습니다.
IF INSERTING THEN
ELSIF UPDATING THEN
ELSIF DELETING THEN 구문도 필요합니다.
aa 에 대한 뷰를 만들고 이 뷰는 특정 사용자에게만 권한을 주고
WITH CHECK OPTION 으로 뷰를 만들어야 할 듯 합니다.
그 사용자가 이 뷰에 변경을 가할 때만 트리거가 동작하게 하려는 건가요?
이 뷰에 트리거를 건다면?
만약 뷰를 통한 입력이 아닌 테이블에 직접 aa 를 입력하는 경우에는 트리거가 동작하지 않을 것입니다.
즉, 특정 유저가 해당 뷰를 이용해 갱신한 내용만 기록한다?
이게 맞다면 그 생각대로 진행하시면 됩니다.
그게 아니라면?
그냥 aa 에 대한 변경기록을 하기만 하면 되는 거라면?
테이블에 트리거 거는게 맞습니다.