更新触发器以将来自两个不同表的数据添加到审计表

时间:2017-07-05 09:33:00

标签: oracle plsql triggers toad

我已经创建了一个更新后触发器,并希望在更新触发时从两个不同的表(GORADID和SPRIDEN)添加数据。这两个表都通过一列(PIDM)连接,因此是否也可以从表2中收集数据?到目前为止我一直在收到ORA等错误:没有绑定变量.. 我也试过做一个select语句。但也没有运气。任何建议都会有所帮助。

error: psl-00049: bad bind variable ':new.spriden_id'
error: psl-00049: bad bind variable ':new.spriden_first_name'
error: psl-00049: bad bind variable ':new.spriden_last_name'

2 个答案:

答案 0 :(得分:1)

您的触发器属于GORADID表,而:new和:old代表此表

你可以试试这样改变你的触发器吗?

CREATE OR REPLACE TRIGGER GORADID_UPDT_TRG1
   AFTER UPDATE OF GORADID_ADDITIONAL_ID
   ON GORADID
   FOR EACH ROW
DECLARE
   SZRGORA_AUDIT_USER_BANNER_ID    VARCHAR2 (150 CHAR);
   SZRGORA_AUDIT_STUDENT_BANNER    VARCHAR2 (9 CHAR);
   SZRGORA_AUDIT_USER_FIRST_NAME   VARCHAR2 (150 CHAR);
   SZRGORA_AUDIT_USER_LAST_NAME    VARCHAR2 (150 CHAR);
   SZRGORA_AUDIT_ADDITIONAL_ID     VARCHAR2 (50 CHAR);
   SPRIDEN_ID                      VARCHAR2 (9 CHAR);
BEGIN
   SELECT USER INTO SZRGORA_AUDIT_USER_BANNER_ID FROM DUAL;

   SELECT SPRIDEN_ID
     INTO SZRGORA_AUDIT_STUDENT_BANNER
     FROM SPRIDEN
    WHERE     SPRIDEN_PIDM =:old.GORADID_PIDM;


   SELECT SPRIDEN_FIRST_NAME, SPRIDEN_LAST_NAME
     INTO SZRGORA_AUDIT_USER_FIRST_NAME, SZRGORA_AUDIT_USER_LAST_NAME
     FROM SATURN.SPRIDEN
    WHERE SPRIDEN_PIDM = (SELECT PIDM
                            FROM SATURN.IDM_STAFF_AFF_ST
                           WHERE USERNAME = USER);

   INSERT INTO SZRGORA_AUDIT
        VALUES (SZRGORA_AUDIT_STUDENT_BANNER,
                :new.GORADID_ADDITIONAL_ID,
                :old.GORADID_ADDITIONAL_ID,
                SZRGORA_AUDIT_USER_FIRST_NAME,
                SZRGORA_AUDIT_USER_LAST_NAME,
                USER,
                'UPDATE',
                SYSDATE,
                :new.GORADID_SURROGATE_ID,
                :new.GORADID_VERSION,
                :new.GORADID_VPDI_CODE);
END;

答案 1 :(得分:1)

尝试以下触发器代码。请注意,在编写触发器ON GORADID表时,您只能对表class MyQwtPlotZoomer : public QwtPlotZoomer { public: MyQwtPlotZoomer(int xAxis, int yAxis, QwtPlotCanvas* canvas, bool doReplot = true) : QwtPlotZoomer(xAxis, yAxis, canvas, doReplot){ } virtual ~MyQwtPlotZoomer(){ } protected: virtual void widgetKeyPressEvent(QKeyEvent* ke) { if ( !isActive() ) { if ( keyMatch( KeyUndo, ke ) ) zoom( -1 ); else if ( keyMatch( KeyRedo, ke ) ) zoom( +1 ); else if ( keyMatch( KeyHome, ke ) ) zoom( 0 ); } } virtual void widgetKeyReleaseEvent(QKeyEvent*){ } }; 的列使用:new:old
您正在选择GORADID。因此,您应该在接下来的查询中使用USER INTO SZRGORA_AUDIT_USER_BANNER_ID,而不是说SZRGORA_AUDIT_USER_BANNER_ID。我认为直接说USER是行不通的。

USERNAME = USER