당신은 아마 행 레벨 트리거가 업데이트; 예를 들면 :
이
SQL> create or replace trigger update_trigger
2 after update on trigger_table
3 begin
4 dbms_output.put_line('change');
5 end;
6/
Trigger created.
SQL> update trigger_table set status = 1;
change
3 rows updated.
Here 당신이 뭔가 더 찾기 :
SQL> create table trigger_table(status number);
Table created.
SQL> insert into trigger_table values (1);
1 row created.
SQL> insert into trigger_table values (2);
1 row created.
SQL> insert into trigger_table values (3);
1 row created.
SQL> create trigger update_trigger
2 after update on trigger_table
3 for each row /* ROW LEVEL */
4 begin
5 dbms_output.put_line('change');
6 end;
7/
Trigger created.
SQL> set serveroutput on
SQL> update trigger_table set status = 1;
change
change
change
3 rows updated.
당신은 모든 업데이트 문 뒤에 발사 테이블 레벨 트리거가 필요합니다. 로 바르게 행 세트가 아니라 하나 하나를 고려, 트리거의 종류, 니콜라스 Krasnov에 의해 관찰
, 당신은하지 :new
또는 :old
값이 있습니다. 요구 사항을 충족시키는 방법은 다음과 같을 수 있지만 까다로운 솔루션이므로 프로덕션 환경에서 사용하기 전에 신중히 확인해야합니다.
트리거를 실행해야하는지 여부를 알기 위해 세마포 테이블을 생성 한 다음 행 수준, 업데이트 전, 테이블 수준 중 하나에서 두 개의 트리거를 사용할 수 있습니다. 행 수준 1은 값을 확인하고 세마포어 테이블을 업데이트하며, 업데이트 후 발생하는 테이블 수준 1은 세마포어를 읽고 필요한 경우 프로 시저를 호출 한 다음 세마포어를 다시 설정합니다. 예를 들어 :
절차는 당신이 행 레벨 트리거를 만든 때문에 2 ~ 3 여러 번 많은 변화가 발생할 때 호출됩니다 귀하의 설명을 바탕으로
SQL> create table trigger_table(status number);
Table created.
SQL> insert into trigger_table values (1);
1 row created.
SQL> insert into trigger_table values (2);
1 row created.
SQL> insert into trigger_table values (3);
1 row created.
SQL> create table checkChange (fire varchar2(3));
Table created.
SQL> insert into checkChange values ('NO');
1 row created.
SQL> create or replace trigger before_update_trigger
2 before update on trigger_table
3 for each row /* ROW LEVEL */
4 begin
5 if :new.status = 3 and :old.status = 2 then
6 update checkChange set fire = 'YES';
7 end if;
8 end;
9/
Trigger created.
SQL> create or replace trigger after_update_trigger
2 after update on trigger_table
3 declare
4 vFire varchar2(3);
5 begin
6 select fire
7 into vFire
8 from checkChange;
9 if vFire = 'YES' then
10 dbms_output.put_line('change');
11 update checkChange set fire = 'NO';
12 end if;
13 end;
14/
Trigger created.
SQL> update trigger_table set status = 2;
3 rows updated.
SQL> update trigger_table set status = 3;
change
3 rows updated.
SQL>
-이 동작을 예상합니다. –
예, 예상 된 동작이지만, 이제는 같은 그룹에 대해 여러 번 병렬 및 일치 작업을 실행하지 않도록 예방이 필요합니다. – ZerOne