2013-12-19 3 views
0

아래의 트리거는 메인에서 날짜 열이 수정되면 col1을 제외한 모든 열을 기본 테이블에서 hist 테이블로 복사합니다. 메인 및 hist에 몇 개의 컬럼을 추가 할 계획이지만, 이럴 때마다 트리거를 수정해야합니다. 내 방아쇠가 col1을 제외하고 메인에있는 모든 열을 선택하도록 할 수있는 방법이 있습니까?하나를 제외한 모든 열을 선택하려면 트리거 하시겠습니까?

CREATE OR REPLACE TRIGGER ins_his BEFORE UPDATE OF datetime ON main 
FOR EACH ROW 
BEGIN 

INSERT INTO hist (col2,col3) VALUES (:new.col2, :new.col3); 

END; 
+1

없음; 없습니다 [관련 있지만 꽤 중복 질문] (http://stackoverflow.com/q/9133120/266304). 각 변경 후에 테이블 정의에서 트리거 작성 스크립트를 생성 할 수 있지만 명시 적으로 나열된 새 컬럼을 사용하여 다시 작성해야합니다. –

답변

0

나는 해결책을 제시 할 수있는 방법을 제시합니다. 이

declare v_table_name  varchar2(30) := 'HIST'; 

cursor cur is select column_name, data_type 
       from all_tab_columns 
       where table_name = v_table_name 
       and column_name != 'COL1' 
       order by column_id; 

:

1)이 같은 커서를 만들기 ... 지금 내가 할 수있는 시간이 없기 때문에이 코드는 정말 테스트되지 않은 상태입니다,하지만 난 당신을 도울 수 있기를 바랍니다 당신은 테이블의 모든 현재 컬럼을 얻을 수있다. 물론, 당신이하는 모든 테이블을 고려할 것이다.

2) 커서를 가져 와서 동적 삽입 문을 만들어야합니다. 이런 식으로 뭔가 :

declare v_column_list  varchar2(500); 
declare v_values_list  varchar2(500); 

for i in cur loop 
    v_column_list := v_column_list||','||i.column_name; 
    v_values_list := v_values_list||', :new.'||i.column_name; 
end loop; 

3) 동적 삽입 문을 작성하고 실행 :이 도움이

declare csql    varchar2(500); 

csql := 'INSERT INTO '||v_table_name||' ('||v_column_list||') VALUES ('||v_values_list||')'; 

EXECUTE IMMEDIATE (csql); 

희망 ...

+0

트리거에서 동적 명령문을 선언하고 실행할 수 있다고해도, 특히 주/내역 테이블 트리거와 같은 경우에는 대개 매우 나쁜 생각입니다. 오버 헤드가 너무 크거나 실행 시간이 너무 오래 걸립니다. 테이블을 '변경'했는지 확인하고 테이블을 외부 테이블에 저장하여 최적화 할 수도 있지만 그 시점에서 트리거를 "영구적으로"다시 생성하여 트리거를 다시 생성 할 수도 있습니다 . –

관련 문제