【问题标题】:sql triggers - want to compare existing row value with value being insertedsql 触发器 - 想要将现有行值与插入的值进行比较
【发布时间】:2012-05-25 02:39:54
【问题描述】:

我正在创建一个触发器,它应该将插入的值与表中已经存在的值进行比较。旧的引用器在这里不起作用,因为我正在插入,但是我怎样才能引用已经存在的东西呢? 这是我的表格和触发器:

    create table events(eid char(2) primary key, cid char(2));

    create table activities(mid char(2), eid char(2),
    primary key (mid, eid),
    constraint activities_fk foreign key (eid) references events(eid));

    create or replace trigger check_valid
    before insert or update on activities
    for each row when (old.mid=new.mid)
    declare
v_eid char(2);
v_cid char(2);
n_cid char(2);

    begin
select eid into v_eid from activities 
where mid=:new.mid;

select cid into v_cid from events
where eid=v_eid;

select cid into n_cid from events
where eid=:new.eid; 

if v_cid=n_cid then
    raise_application_error(-20000, 'Error');
end if;
    end check_valid;
    /
    show errors;

【问题讨论】:

    标签: sql triggers insert


    【解决方案1】:

    您通常无法从要插入到触发器中的表中进行选择。这就是变异表问题,或者我经常称之为“该死的变异表问题”。

    基本上,不要这样做。这是个坏主意。如果您同时在桌面上运行两个会话会发生什么?触发器触发,并且两个会话都没有看到另一个会话在提交之前所做的事情,这是在触发器之后。那么你的数据库中就有了意想不到的数据。

    Tom Kyte says, "当我遇到一个变异表错误时,我有一个严重的致命缺陷 按照我的逻辑。”

    【讨论】:

      猜你喜欢
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      相关资源
      最近更新 更多