更新触发器以将两个不同表中的数据添加到审计表中
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 插入数据。 请为SPRIDEN
和SZRGORA_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)以上是关于更新触发器以将两个不同表中的数据添加到审计表中的主要内容,如果未能解决你的问题,请参考以下文章