SQL触发器后备

时间:2018-11-01 19:49:16

标签: mysql database triggers db2

我的老板或任何DBA都不知道如何创建触发器,而我也不是(新手程序员),他们只是从DB复制/粘贴了一些旧触发器作为示例。无论如何,我的触发器在更新/插入后将数据从一个表复制到另一个表。插入到原始表的插入/更新至关重要,因此,如果发生任何故障,我只希望触发器失败并且原始插入/更新仍然可以正常运行。

我正在使用MySQL进行测试,但是我们使用DB2,但是它们不会让我访问其DB2环境中的测试触发器,因此这是我可以用来测试触发器逻辑的最接近的解决方案。

我注意到示例触发器中包含BEGIN ATOMIC,这可以满足我的要求吗?在MySQL中什么是等效的,所以我可以测试?

我的触发器中有子选择,这些安全吗?我应该声明变量以帮助避免问题吗?

2 个答案:

答案 0 :(得分:1)

--#SET TERMINATOR @
create table test_trigger (i int) in userspace1@
create table test_trigger_copy (i int) in userspace1@

create or replace trigger test_trigger_air
after insert on test_trigger
referencing new as n
for each row
begin
  declare continue handler for sqlexception begin end;
  insert into test_trigger_copy(i) values (case when mod (n.i, 2)=0 then cast(RAISE_ERROR('70001', 'No even numbers!') as int) else n.i end);
end@

insert into test_trigger(i) values 1, 2, 3@
select * from test_trigger_copy@
select * from test_trigger@

对于DB2(至少对于LUW)数据库。

当您尝试向基表中插入偶数时,触发器内的INSERT语句会生成异常。 CONTINUE处理程序使用异常,因此您可以在基表中获得所有插入的数字,而在复制表中仅获得奇数。

答案 1 :(得分:0)

与DB2的BEGIN ATOMIC等效的紧密MySQL将是START TRANSACTIONCOMMITEXIT HANDLERROLLBACK的组合。代替:

BEGIN ATOMIC
<statement(s)>
END

一个人可以在MySQL中执行以下操作:

BEGIN
  DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN
    ROLLBACK;
    RESIGNAL;
    END;
  START TRANSACTION;
     <statement(s)>
  COMMIT;
END

关于触发器中的子选择(您的意思是子查询?),只要您遵守restrictions,我就看不到为什么它们不起作用。