【问题标题】: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 列有关系

标签: oracle plsql triggers toad


【解决方案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)
    猜你喜欢
    • 2021-05-20
    • 2023-01-24
    • 2014-03-07
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    相关资源
    最近更新 更多