SQL:插入时触发

时间:2016-12-16 09:55:50

标签: sql oracle plsql triggers

我有一个表格X,其中列已启用,其默认值为' T'。我需要一个触发器,它可以根据另一个表Y中存在的值将值放入启用列中,该表有一行名为trusted且值为' Y'。

因此,每次使用值插入表X时,我希望应根据表Y的行信任值更新enabled的值。

如果信任=' N'然后设置enable =' F' 否则启用=' T'

很抱歉没有提供任何代码。到目前为止,我对这个策略感到有点困惑。

var string= "1,2,3,4-8,15,17,18-21,22";
var chunks = string.split(",");
var numbers = [];
for (var i = 0; i < chunks.length; i++) {
  var chunk = chunks[i];
  if (chunk.indexOf('-') < 0) {
    numbers.push(parseInt(chunk));
  }
  else {
    var pair = chunk.split('-');
    for (var j = pair[0]; j <= pair[1]; j++) {
      numbers.push(parseInt(j));
    }
  }
}
console.log(numbers);

2 个答案:

答案 0 :(得分:1)

create or replace trigger tg_ins_x before insert on x for each row
begin
  select case when value = 'Y' then 'T' else 'F' end 
    into :new.enabled 
    from y where key = 'trusted';
end;

如果您不想覆盖enabled的提供值:

create or replace trigger tg_ins_x before insert on x for each row
begin
  if :new.enabled is null then
    select case when value = 'Y' then 'T' else 'F' end 
      into :new.enabled 
      from y where key = 'trusted';
  end if;
end;

您可以添加异常(太多行,找不到数据,其他)引发错误或指定默认值:

exception when no_data_found then
    :new_enabled := 'F';

答案 1 :(得分:1)

不是使用触发器,为什么不改为使用视图呢?

类似的东西:

create or replace view x_vw (id, username, enable) as
select x.id
       x.username
       case when (select upper(value) from y where key = 'trusted') = 'N' then 'F'
            else 'T'
       end enable
from   x;

N.B。这假定如果您将可信行的值更改为N,则需要将X中的所有行更改为“F&#39;”。如果您不希望发生这种情况,请坚持使用触发器。