问题描述
create table accounts(AccountId char(6) primary key, BranchId char(4), CustId char(4) , AcctBal number(9), Overdraftlimit number(7)); create table transactions(TransactId char(6) primary key, AccountID char(6) , Amount number(7) , Tdate date ); create table fee(FeeId char(5) primary key, CustTrans char(6) fk, Fee Number(3));
我有一个在插入每个新记录之前触发的事务触发器。计算录入的取款金额是否小于账户余额+透支限额。如果不是的话,我就抛出一个错误。我的问题是,当提款金额在账户余额+透支限额内时,我将收取透支费用,并在费用表中另作记录。因此,我的事务需要先输入,然后再输入费用事务,因为它是外键。但是如果我试图插入到触发器中的同一个事务表,它就会变成一个嵌套的sql ,不断触发同一个触发器,我如何克服这个问题呢?
谢谢
create or replace trigger Tran before insert or update on Transactions for each row ... ... insert into transactions values(); insert into fee values(); ..
专家解答
我是多么讨厌触发器!! !
http://www.oracle.com/technetwork/issue-archive/2008/08-sep/o58asktom-101055.html
我敢打赌,你没有选择更新帐户表在你的触发器,你呢。我怀疑你的代码是多用户的。
这就要求使用一个存储过程,一个很好的线性方法- -稳定的代码(使用必要的锁!您需要确保正在连续处理针对某个帐户的事务!! ) .易懂,易读。没有“神奇”的副作用。可维护。可测试。
你能用触发器来做这个吗?可能吧。但我甚至不想去看它,因为它是错误的,它是一个糟糕的编程实践。
只需使用代码,简单明了的代码,容易理解的代码,代码都在一个地方,这样你就可以真正理解它,更重要的是,这样下一代的程序员就可以理解它了。
http://www.oracle.com/technetwork/issue-archive/2008/08-sep/o58asktom-101055.html
我敢打赌,你没有选择更新帐户表在你的触发器,你呢。我怀疑你的代码是多用户的。
这就要求使用一个存储过程,一个很好的线性方法- -稳定的代码(使用必要的锁!您需要确保正在连续处理针对某个帐户的事务!! ) .易懂,易读。没有“神奇”的副作用。可维护。可测试。
你能用触发器来做这个吗?可能吧。但我甚至不想去看它,因为它是错误的,它是一个糟糕的编程实践。
只需使用代码,简单明了的代码,容易理解的代码,代码都在一个地方,这样你就可以真正理解它,更重要的是,这样下一代的程序员就可以理解它了。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




