C# Oracle dbms_alert.signal为多个操作触发一次

C# Oracle dbms_alert.signal为多个操作触发一次,c#,oracle,oracle11g,devart,C#,Oracle,Oracle11g,Devart,我在Oracle中有一个触发器,它调用sys.dbms\u alert.signal。DevArtOracleAlerter通过自托管服务接收这些警报 然而,我发现即使是多次删除/更新/插入,OracleLetter也只收到一条记录的警报,而不是所有记录的警报 有没有办法查看Oracle(11g)中触发的信号的历史记录或日志 这是发送警报的触发器类型的示例: create or replace trigger MACL.ZM_SOCOMM_trigger after delete or inse

我在Oracle中有一个触发器,它调用
sys.dbms\u alert.signal
。DevArt
OracleAlerter
通过自托管服务接收这些警报

然而,我发现即使是多次删除/更新/插入,
OracleLetter
也只收到一条记录的警报,而不是所有记录的警报

有没有办法查看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
    }
编辑


我在触发器中添加了一条语句,该语句在每次触发器触发时将一些数据插入到审核表中,并且触发器的触发次数似乎正确。

根据文档:

与相应的应用程序等待调用相比,可以更频繁地发出警报信号。在这种情况下,旧警报将被丢弃。应用程序始终获取最新警报(基于事务提交时间)


为了澄清这一点,您正在运行一条insert语句来更新多行。是否仅对其中一行的信息发出警报?你能举一个Oracle触发器的例子来说明这个问题吗?是的,这是正确的。我将添加一个触发器示例。您可能想看看Oracle AQ。谢谢,Jeffrey。回到绘图板上!