【问题标题】:Values of the inserted row in a Trigger Oracle触发器 Oracle 中插入行的值
【发布时间】:2017-04-01 09:40:12
【问题描述】:

我想要一个更新列值的触发器,但我只想更新一小部分取决于插入行的值的行。 我的触发器是:

CREATE OR REPLACE TRIGGER example
AFTER INSERT ON table1
FOR EACH ROW
BEGIN
UPDATE table1 t
SET column2 = 3
WHERE t.column1 = :new.column1;
END;
/

但是当我使用 FOR EACH ROW 时,我在尝试时遇到了问题,我得到了变异表运行时错误。 其他选项是不设置 FOR EACH ROW,但如果我这样做,我不知道插入的“column1”进行比较(或者我不知道如何知道它)。

如何更新一组取决于最后插入的行的行?

我正在使用 Oracle 9。

【问题讨论】:

  • 我曾经在 FOR EACH ROW TRIGGER 的工作表中写入值,在后表触发器中我处理了从工作表中选择的值。
  • 强烈建议您遵循以下@GordonLinoff 的建议。这不是一个好的数据模型。

标签: sql database oracle triggers


【解决方案1】:

您应该避免在触发器中定义的同一表上使用 DML 语句。使用beforeDML改变当前表的值。

create or replace trigger example
before insert on table1
for each row
begin
    :new.column2 := 3;
end;
/

您可以使用 pragma automatic_transaction 修改同一张表:

create or replace trigger example
after insert on table1 for each row
declare
    procedure setValues(key number) is
        pragma autonomous_transaction;
    begin
        update table1 t
        set column2 = 3
        where t.column1 = key
        ;
    end setValues;    
begin
    setValues(:new.column1);
end;
/

但我建议您按照@GordonLinoff 回答您的问题 - 在触发器正文中修改同一个表是个坏主意。

另见here

【讨论】:

  • 这是在 Oracle 中编写触发器的正确​​方法,但不幸的是,这并不能解决问题,因为 OP 想要一次更新多行。
  • 解决方案在我的答案中包含的链接中。
【解决方案2】:

如果您在更新一行时需要更新table1 中的多行,那么您的数据模型似乎有问题。

此需求表明您需要一个单独的表,其中每个 column1 一行。然后,您可以使用join 获取该表中的值。然后触发器将更新另一个表,因此不会有突变问题。

【讨论】:

    【解决方案3】:
    `create table A 
     (
      a INTEGER,
      b CHAR(10)
     );
     create table B
     (
      b CHAR (10),
      d INTEGER 
     );
     create trigger trig1
     AFTER INSERT ON A
     REFERENCING NEW AS newROW
     FOR EACH ROW
     when(newROW.a<=10)
     BEGIN 
     INSERT into B values(:newROW.b,:newROW.a);
     END trig1;
     insert into A values(11,'Gananjay');
     insert into A values(5,'Hritik');
    
     select * from A;
     select * from B;`
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-11
      • 2021-08-25
      • 2014-06-28
      • 1970-01-01
      • 2017-06-26
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      相关资源
      最近更新 更多