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

Posted

技术标签:

【中文标题】更新触发器以将两个不同表中的数据添加到审计表中【英文标题】:Update trigger to add data from two different tables onto audit table 【发布时间】:2017-07-05 09:33:00 【问题描述】:

我创建了一个更新后触发器,并希望在更新触发时从两个不同的表(GORADID 和 SPRIDEN)添加数据。这两个表都由一列(PIDM)连接,因此是否也可以从表 2 中收集数据?到目前为止,我遇到了诸如 ORA: no bind variables 之类的错误。 我也试过做一个选择语句。但也没有运气。任何建议都会有所帮助。

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'

【问题讨论】:

你能发布你收到的实际错误和 GORADID 的表结构 @XING - 问题不在于 GORADID。这是第二张表(SPRIDEN),我试图从中选择数据。请注意,我可以成功地从 GORADID 插入数据。 请为SPRIDENSZRGORA_AUDIT 表添加结构。 请注意,GORADID 和 SPRIDEN 通过 PIDM 列有关系 【参考方案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;

【讨论】:

【参考方案2】:

试试下面的代码作为你的触发器。请注意,当您在 GORADID 表上编写触发器时,您只能将 :new:old 用于表 GORADID 的列。 您正在选择USER INTO SZRGORA_AUDIT_USER_BANNER_ID。所以你应该在你的下一个查询中使用SZRGORA_AUDIT_USER_BANNER_ID,而不是说USER。我认为直接说USERNAME = USER 是行不通的。

CREATE OR REPLACE TRIGGER AUDIT_USER.GORADID_UPDT_TRG1
AFTER UPDATE OF GORADID_ADDITIONAL_ID
ON GORADID
FOR EACH ROW
  DECLARE
    v_SZRGORA_AUDIT_USER_BANNER_ID VARCHAR2(150 CHAR);
    v_SZRGORA_AUDIT_STUDENT_BANNER VARCHAR2(9 CHAR);
    v_SZRGORA_AUDIT_USER_FIRST_NAME VARCHAR2(150 CHAR);
    v_SZRGORA_AUDIT_USER_LAST_NAME VARCHAR2(150 CHAR);
  BEGIN
    SELECT USER INTO v_SZRGORA_AUDIT_USER_BANNER_ID FROM DUAL;

    SELECT SPRIDEN_ID
     INTO v_SZRGORA_AUDIT_STUDENT_BANNER
    FROM SATURN.SPRIDEN
     WHERE SPRIDEN_PIDM = :new.GORADID_PIDM
      AND GORADID_ADDITIONAL_ID = :new.GORADID_ADDITIONAL_ID;

    SELECT SPRIDEN_FIRST_NAME, SPRIDEN_LAST_NAME
     INTO v_SZRGORA_AUDIT_USER_FIRST_NAME, v_SZRGORA_AUDIT_USER_LAST_NAME
    FROM SATURN.SPRIDEN
     WHERE SPRIDEN_PIDM =
     (SELECT PIDM FROM SATURN.IDM_STAFF_AFF_ST
       WHERE USERNAME = v_SZRGORA_AUDIT_USER_BANNER_ID);

    INSERT INTO AUDIT_USER.SZRGORA_AUDIT VALUES
    ( v_SZRGORA_AUDIT_STUDENT_BANNER,
     :new.GORADID_ADDITIONAL_ID,
     :old.GORADID_ADDITIONAL_ID,
     v_SZRGORA_AUDIT_USER_FIRST_NAME,
     v_SZRGORA_AUDIT_USER_LAST_NAME,
     v_SZRGORA_AUDIT_USER_BANNER_ID,
     'UPDATE',
     SYSDATE,
     :new.GORADID_SURROGATE_ID,
     :new.GORADID_VERSION,
     :new.GORADID_VPDI_CODE);
  END;
/

【讨论】:

我不断收到这些 [错误] ORA-00942 (15: 27): PL/SQL: ORA-00942: 表或视图不存在 [错误] ORA-00904 (26: 11): PL/SQL: ORA-00904: "GORADID_ADDITIONAL_ID": 标识符无效 问题依然存在。 [错误] ORA-00904 (17: 11): PL/SQL: ORA-00904: "GORADID_ADDITIONAL_ID": 标识符无效 哦,是的。因为 GORADID_ADDITIONAL_ID 不是SPRIDEN 表的一部分。 GORADID_ADDITIONAL_ID 与SPRIDEN 的哪一列有关?或者两个表之间只有一个通过 PIDM 的关系? No.Column GORADID_ADDITIONAL_ID 是 GORADID 表的一部分。并且与 SPIDEN 无关。 GORADID 和 SPRIDEN 之间的唯一关系是带有 PIDM 的列(例如 Goradid_pidm 和 Spriden_pidm)

以上是关于更新触发器以将两个不同表中的数据添加到审计表中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用触发器将基表的所有更新列添加到审计表的多行?

如果 Column_X 更新,PLSQL 触发器记录对审计表的更新

步步为营-52-触发器

使用触发器审计操作

如何使用触发器从两个不同的表中插入数据

两张表 在一张表中插入数据时要使用触发器也更新另一张 有错误