1

2 つのトリガーがあります。

create or replace
TRIGGER bl_process_type_updated
before update
ON bl
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN 
    :new.process_type := 'UPDATED';
EXCEPTION    
 WHEN OTHERS THEN  
 NULL; 
 END;

別のもの:

create or replace
TRIGGER bl_process_type_deleted
after insert or update
ON ot
FOR EACH ROW
DECLARE
    building_id bl.bl_id%TYPE;
BEGIN 
   building_id := :new.bl_id ;
   if(:new.status = 'Sold' or :new.status = 'LeaseTerminated') then
      update bl set process_type='DELETED' where bl_id = building_id;
    end if;
 EXCEPTION    
 WHEN OTHERS THEN  
 NULL; 
 END;

blどちらのトリガーも、テーブルの process_type 列を更新します。テーブルを更新するotと、blテーブルのトリガーが最後に起動するため、process_type の値は UPDATED になりますが、otテーブルが更新または挿入されると、otテーブルのトリガーが最後に起動し、process_type の値が DELETED になります。

どうすればそれを達成できますか?

4

2 に答える 2

0

私は@Thomasのソリューションから始めたでしょうが、その後のコメントに基づいて、現在、blテーブルがprocess_typeUPDATEDに設定する必要があるか、DELETEDのままにする必要があるかを知る信頼できる方法がないことは明らかです。

したがって、おそらく、行を DELETED のままにしておく必要があるotことを伝える何らかの手段を構築する必要があります。bl

まず、トリガーが発火する順序に影響を与えようとしないでください。

1 つのオプションは、トリガーを完全に使用するという考えを放棄することです。つまり、これらのテーブルで挿入と更新を実行し、必要な後続のロジックを処理する API (PL/SQL パッケージ) を作成します。明らかに、API を使用するにはアプリケーションを変更する必要があります。これを簡単にする簡単な方法は、テーブルの前にビューを配置し、代わりに API を呼び出すトリガーを配置することです。

bl_process_type_updatedもう 1 つのオプションは、更新がトリガーからのものである場合にトリガーをオフにする条件をトリガーに入れるbl_process_type_deletedことです。スイッチは、データベース パッケージに存在する必要があります。たとえば、次のようになります。

CREATE OR REPLACE PACKAGE bl_trigger_pkg AS
  bl_trigger_enabled BOOLEAN := TRUE;
END;
/

create or replace
TRIGGER bl_process_type_updated
  before update
  ON bl
  REFERENCING NEW AS NEW OLD AS OLD
  FOR EACH ROW
BEGIN 
  IF bl_trigger_pkg.bl_trigger_enabled THEN
    :new.process_type := 'UPDATED';
  END IF;
END;

create or replace
TRIGGER bl_process_type_deleted
  after insert or update
  ON ot
  FOR EACH ROW
DECLARE
   building_id bl.bl_id%TYPE;
BEGIN 
   building_id := :new.bl_id ;
   if(:new.status = 'Sold' or :new.status = 'LeaseTerminated') then
      bl_trigger_pkg.bl_trigger_enabled := FALSE;
      update bl set process_type='DELETED' where bl_id = building_id;
      bl_trigger_pkg.bl_trigger_enabled := TRUE;
   end if;
END;

ちなみに、WHEN OTHERS THEN NULL;ビットを取り除く必要があります。すべての例外を非表示にするだけではいけません。

于 2013-07-23T01:09:04.100 に答える