【问题标题】:How to automatically update a column of the second table if the same column is updated in the first table?如果在第一个表中更新了同一列,如何自动更新第二个表的列?
【发布时间】:2022-11-03 19:13:32
【问题描述】:

有第一个表 M_TAX_ORG,当更新 NAME_R 列时,第二个表 M_TAX_ORG_ADM_INFO 也应该自动更改 NAME_R 列。 (从截图可以看出, M_TAX_ORG_ADM_INFO 与 M_TAX_ORG 相关联)有现成的脚本吗?也许带触发器?

CREATE OR REPLACE TRIGGER M_TAX_ORG_AFTER_UPDATE_1
    AFTER UPDATE
    ON M_TAX_ORG
    FOR EACH ROW
DECLARE
    v_NAME_R VARCHAR2(600 char);
BEGIN

    SELECT NAME_R
    INTO v_NAME_R
    FROM M_TAX_ORG WHERE TEST_USER.M_TAX_ORG.M_TAX_ORG_ID = TEST_USER.M_TAX_ORG_ADM_INFO.M_TAX_ORG_ID;

    UPDATE M_TAX_ORG_ADM_INFO ADM
    SET (ADM.NAME_R) = v_NAME_R
    WHERE EXISTS(SELECT M_TAX_ORG.NAME_R
                 FROM M_TAX_ORG
                 WHERE M_TAX_ORG.M_TAX_ORG_ID = ADM.M_TAX_ORG_ID);
END;

我试过这个脚本。但这是不正确的。

【问题讨论】:

  • “不正确”不是很有帮助——确实会出现编译错误、运行时错误或错误结果?首先,您应该使用:new 而不是再次查询触发器所在的表。但是你为什么要在两个表中复制相同的数据呢?

标签: sql oracle plsql oracle-sqldeveloper plsqldeveloper


【解决方案1】:

如果没有您的表格和数据,以及您当前尝试的行为,就很难确定;但您似乎正在寻找类似的东西:

CREATE OR REPLACE TRIGGER M_TAX_ORG_AFTER_UPDATE_1
    -- only fie if NAME_R was set in the update statement
    AFTER UPDATE OF NAME_R
    ON M_TAX_ORG
    FOR EACH ROW
BEGIN
    UPDATE M_TAX_ORG_ADM_INFO ADM
    SET ADM.NAME_R = :new.NAME_R
    WHERE ADM.M_TAX_ORG_ID = :new.M_TAX_ORG_ID = ADM.M_TAX_ORG_ID;
END;

这使用the new pseudorecord 来获取受影响行的ID 和名称,而不是尝试重新查询它;并将它们用于更新另一个表。

我还把它改成了AFTER UPDATE OF NAME_R,所以它只有在该列受到影响时才会触发。但请注意,这仅意味着它包含在更新中 - set NAME_R = <something> - 而不是该值实际发生了变化。您可能需要更新条件来检查新值是否实际上不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    相关资源
    最近更新 更多