Oracle: 트리거 실행을 위한 한 열의 업데이트 제외
oracle I에서는 열을 지정할 수 있는데, 이 열은 트리거의 발화를 유도해야 합니다.
create or replace trigger my_trigger
before update of col1, col2, col3 on my_table for each row
begin
// the trigger code will be executed only if col1 or col2 or col3 was updated
end;
이제 저는 다음을 수행하고자 합니다.열이 하나만 업데이트된 상태에서 트리거가 작동하지 않았으면 합니다.이것이 어떻게 가능한 걸까요?
나는 하나를 제외한 모든 열을 나열할 수 있었는데, 이것은 방아쇠의 발사를 유도해서는 안 됩니다.이것은 기둥이 많은 테이블에서는 꽤 번거롭습니다.
또 다른 방법은 다음과 같이 UPDATE 기능을 사용하는 것입니다.
if not updating('COL3') then ...
그러나 COL1과 COL3를 한번에 변경하면 그 문구는 거짓으로 평가됩니다.그것은 제가 원하는 것이 아니고, 한 열(COL3)만 업데이트되었을 때 실행을 제한하고 싶습니다.
당신은 다음과 같은 것을 할 수 있습니다.
create or replace trigger my_trigger
before update on my_table
for each row
declare
n_cols integer := 0;
begin
for r in (select column_name from all_tab_columns
where table_name = 'MY_TABLE'
and owner = 'MY_SCHEMA')
loop
if updating(r.column_name) then
n_cols := n_cols + 1;
exit when n_cols > 1;
end if;
end loop;
if n_cols > 1 then
do_something;
end if;
end;
아마 엄청나게 효율적이지는 않을 겁니다!
어제도 똑같은 문제가 있었습니다.하나를 제외한 모든 분야에서 발사되는 방아쇠를 코드화하고 싶었습니다. 테이블에는 103개의 열이 있었습니다.
처음 코드를 작성했습니다.
if (:OLD.col1<>:NEW.col1 or :OLD.col2<>:NEW.col2 or :OLD.col3<>:NEW.col3 ....)
하지만 null 값에 문제가 있어서 다음과 같이 덧붙였습니다.
if (NVL(:OLD.col1,0)<>NVL(:NEW.col1,0) or NVL(:OLD.col2,0)<>NVL(:NEW.col2,0) ....)
그런데 DATE 칼럼에 문제가 생겨서 엉망이 되었습니다.
가장 좋은 해결책은 확인하려는 모든 열을 "OF"에 나열하는 것이라고 생각합니다.
AFTER INSERT OR UPDATE of cOL1, col2, col3 ... colN ON table1
'우아한' 건 아니었지만...완벽하게 작동했습니다.
듣고 싶은 대답이 아닐 텐데 오히려 유지비 부담을 지나치게 떠넘기고 있는 것 같습니다.테이블의 구조가 생산에 들어간 후에 자주 바뀌는 것은 정상적인 일이 아닙니다.만약 당신이 열 번호나 이름이 자주 바뀌는 테이블을 가지고 있다면, 나는 당신에게 더 큰 건축적인 문제가 있다고 제안하고 싶습니다.
지금 모든 열 이름을 입력하고 유지 관리가 문제가 되는지 확인하십시오.DDL 스크립트가 가끔 변경되는 것을 방지하기 위해 트리거(매 업데이트 시마다 지불하는 세금)에 복잡한 구현을 코드화하는 것은 가치가 없습니다.
트리거 본문이나 다른 항목에 있는 다른 모든 열을 테이블에 나열하는 것을 피할 수 있는 방법은 없다고 생각합니다.before update of ...
절
그러나 열이 추가되거나 제거되는 경우 테이블에 알터 트리거를 작성하여 업데이트 트리거를 자동으로 재생성할 수도 있습니다.작업이 조금 더 필요하지만, 그러면 자동으로 정비가 되어야 합니다.
언급URL : https://stackoverflow.com/questions/1421645/oracle-excluding-updates-of-one-column-for-firing-a-trigger
'programing' 카테고리의 다른 글
안드로이드 1.6: "android.view.WindowManager $BadToken 예외:창을 추가할 수 없습니다. 토큰 null은 응용 프로그램을 위한 것이 아닙니다." (0) | 2023.09.09 |
---|---|
Swift에서 실패 가능한 초기화를 구현하는 모범 사례 (0) | 2023.09.09 |
Mysql에도 mssql과 같은 @@ROWCOUNT가 있습니까? (0) | 2023.09.09 |
표의 불일치 - Galera 군집 분석 (0) | 2023.09.09 |
특정 파일/파일 이름을 찾기 위한 파워셸 스크립트? (0) | 2023.09.09 |