这将无法正常工作。想想你在问什么。你想要一个触发器,当一行被插入到tableA中时触发到将一行插入表A。触发器什么时候停止发射?
甲骨文是足够聪明的一步,防止触发节节攀升无穷:
SQL> create or replace trigger t69_after_ins
2 after insert on t69
3 begin
4 insert into t69 values ('blah', 'blah', 99);
5 end;
6/
Trigger created.
SQL>
这里发生了什么:
SQL> insert into t69 values ('this', 'that', 1)
2/
insert into t69 values ('this', 'that', 1)
*
ERROR at line 1:
ORA-00036: maximum number of recursive SQL levels (50) exceeded
ORA-06512: at "APC.T69_AFTER_INS", line 2
ORA-04088: error during execution of trigger 'APC.T69_AFTER_INS'
ORA-06512: at "APC.T69_AFTER_INS", line 2
ORA-04088: error during execution of trigger 'APC.T69_AFTER_INS'
ORA-06512: at "APC.T69_AFTER_INS", line 2
ORA-04088: error during execution of trigger 'APC.T69_AFTER_INS'
ORA-06512: at "APC.T69_AFTER_INS", line 2
ORA-04088: error during execution of trigger 'APC.T69_AFTER_INS'
ORA-06512: at "APC.T69_AFTER_INS", line 2
ORA-04088: error during execution of trigger 'APC.T69_AFTER_INS'
ORA-06512: at "APC.T69_AFTER_INS", line 2
ORA-04088: error during execution of trigger 'APC.T69_AFTER_INS'
ORA-06512: at "APC.T69_AFTER_INS", line 2
ORA-04088: error during execution of trigger 'APC.T69_AFTER_INS'
ORA-06512: at "APC.T69_AFTER_INS", line 2
ORA-04088: error during execution of trigger 'APC.T69_AFTER_INS'
ORA-06512: at "APC.T69_AFTER_INS", line 2
ORA-04088: error during execution of trigger 'APC.T69_AFTER_I
SQL>
“有什么办法,我可以更新 TableA根据来自TableB的信息给出 这两个表中的ID?“
如果“更新”你实际上意味着UPDATE和 - 关键 - 取决于精确的逻辑,你希望实现,那么也许是:
SQL> create or replace trigger t69_after_ins
2 after insert on t69
3 begin
4 update t69
5 set name = (select name from t23
6 where t23.id = t69.id)
7 where name is null;
8 end;
9/
Trigger created.
SQL> insert into t69 (id, name) values (122, null)
2/
1 row created.
SQL> select name from t69
2 where id = 122
3/
NAME
----------
MAISIE
SQL>
然而,这仍然是一个坏主意。触发器很难理解,并且可能会对我们的SQL性能产生有害的影响。所以我建议你尝试找出一种将你的逻辑构建到应用程序主体中的方法,而不是尝试使用触发器。
来源
2010-07-17 04:08:49
APC
好吧,这是有道理的。有没有什么办法可以根据来自TableB的信息更新TableA,给定两个表中的ID? – relyt 2010-07-17 04:26:44