2016-05-10 22 views
0

Oracleには、sys.dbms_alert.signalというトリガがあります。 DevArt OracleAlerterは、自己ホストサービスでこれらのアラートを受信します。Oracle dbms_alert.signal複数のアクションに対して1回起動する

しかし、私も複数削除/更新のために/ OracleAlerterを挿入することを発見していますのレコードのちょうどではなく、1つのアラートのレコードのすべてのをアラートを受信して​​います。

Oracle(11g)で起動されたシグナルの履歴またはログを表示する方法はありますか?

これは、アラートを送信しているトリガーのタイプの例である:ここで

create or replace trigger MACL.ZM_SOCOMM_trigger 
after delete or insert or update on MACL.SOCOMM 
for each row 
declare 
    alertData varchar2(1000); 
begin 

alertData := '{"Schema":"MACL","Table":"SOCOMM","Index":"I_SOCOM_KEY","Columns":[{"COLUMN_NAME":"SOCOM_ORDREF","COLUMN_POSITION":1,"COLUMN_VALUE":"#SOCOM_ORDREF#"},{"COLUMN_NAME":"SOCOM_ORDLINE","COLUMN_POSITION":2,"COLUMN_VALUE":"#SOCOM_ORDLINE#"},{"COLUMN_NAME":"SOCOM_COMSEQ","COLUMN_POSITION":3,"COLUMN_VALUE":"#SOCOM_COMSEQ#"},{"COLUMN_NAME":"SOCOM_COMTYPE","COLUMN_POSITION":4,"COLUMN_VALUE":"#SOCOM_COMTYPE#"},{"COLUMN_NAME":"SOCOM_TEXT","COLUMN_POSITION":5,"COLUMN_VALUE":"#SOCOM_TEXT#"}],"ChangePlaceHolder":"#CHANGE#"}'; 

IF INSERTING OR UPDATING THEN 
    alertData := replace(alertData, '#SOCOM_ORDREF#', :new.SOCOM_ORDREF); 
    alertData := replace(alertData, '#SOCOM_ORDLINE#', :new.SOCOM_ORDLINE); 
    alertData := replace(alertData, '#SOCOM_COMSEQ#', :new.SOCOM_COMSEQ); 
    alertData := replace(alertData, '#SOCOM_COMTYPE#', :new.SOCOM_COMTYPE); 
    alertData := replace(alertData, '#SOCOM_TEXT#', :new.SOCOM_TEXT); 
ELSIF DELETING THEN 
    alertData := replace(alertData, '#SOCOM_ORDREF#', :old.SOCOM_ORDREF); 
    alertData := replace(alertData, '#SOCOM_ORDLINE#', :old.SOCOM_ORDLINE); 
    alertData := replace(alertData, '#SOCOM_COMSEQ#', :old.SOCOM_COMSEQ); 
    alertData := replace(alertData, '#SOCOM_COMTYPE#', :old.SOCOM_COMTYPE); 
    alertData := replace(alertData, '#SOCOM_TEXT#', :old.SOCOM_TEXT); 
END IF; 

IF INSERTING THEN 
    alertData := replace(alertData, '#CHANGE#', 'INSERT'); 
ELSIF DELETING THEN 
    alertData := replace(alertData, '#CHANGE#', 'DELETE'); 
ELSE 
    alertData := replace(alertData, '#CHANGE#', 'UPDATE'); 
END IF; 

sys.dbms_alert.signal('ooalert_sync', alertData); 
END; 

は、私は、Oracleによって発射信号をサブスクライブするために使用していたコードです:

public void SetUpAlerts() => RegisterHandlers(CreateAlerter()); 

    private static void RegisterHandlers(OracleAlerter alerter) 
    { 
     alerter.Alert += AlerterOnAlert; 
     alerter.Error += AlerterOnError; 
     alerter.WaitTimeout += AlerterOnWaitTimeout; 
     alerter.Stopped += AlerterOnStopped; 

     alerts.Add(alerter); 
     alerter.Start(); 
    } 

    private OracleAlerter CreateAlerter() => new OracleAlerter 
    { 
     Timeout = Day, 
     AlertName = "Name", 
     Connection = Factory.CreateSourceConnection() as OracleConnection 
    }; 

    private static void AlerterOnAlert(object sender, OracleAlerterAlertEventArgs args) 
    { 
     //handle alert 
    } 

EDIT

私は、トリガが発生するたびに監査テーブルにデータを挿入するトリガに文を追加しました。トリガーが正しい回数発射されたことを示す梨。文書によると

+1

明確にするために、あなたは複数の行を更新し、単一のINSERT文を実行しています。これらの行の1つのみに関する情報が警告されていますか?この問題を示すOracleトリガーの最小限の例を投稿してください。 – Ben

+0

はい、正しいです。私はトリガの例を追加します。 –

+0

代わりにOracle AQを参照してください。 –

答えて

1

アラートは、より頻繁に対応するアプリケーションが呼び出しを待つよりも、シグナリングすることができます。そのような場合、古いアラートは破棄されます。アプリケーションは常に(トランザクションコミット時間に基づいて)最新のアラートを取得します。

http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_alert.htm#ARPLS65178

+0

ありがとう、ジェフリー。ふりだしに戻る! –

関連する問題