我的老板或任何DBA都不知道如何创建触发器,而我也不是(新手程序员),他们只是从DB复制/粘贴了一些旧触发器作为示例。无论如何,我的触发器在更新/插入后将数据从一个表复制到另一个表。插入到原始表的插入/更新至关重要,因此,如果发生任何故障,我只希望触发器失败并且原始插入/更新仍然可以正常运行。
我正在使用MySQL进行测试,但是我们使用DB2,但是它们不会让我访问其DB2环境中的测试触发器,因此这是我可以用来测试触发器逻辑的最接近的解决方案。
我注意到示例触发器中包含BEGIN ATOMIC,这可以满足我的要求吗?在MySQL中什么是等效的,所以我可以测试?
我的触发器中有子选择,这些安全吗?我应该声明变量以帮助避免问题吗?
答案 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 TRANSACTION
,COMMIT
,EXIT HANDLER
和ROLLBACK
的组合。代替:
BEGIN ATOMIC
<statement(s)>
END
一个人可以在MySQL中执行以下操作:
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN
ROLLBACK;
RESIGNAL;
END;
START TRANSACTION;
<statement(s)>
COMMIT;
END
关于触发器中的子选择(您的意思是子查询?),只要您遵守restrictions,我就看不到为什么它们不起作用。