對於同一張表,EachRow Trigger和Statement Trigger的前後被觸發順序是什麼?望高手點撥

skyly07 2005-03-04 02:27:48
環境: Oracle 9i,表:test,欄位;a1,a2,a3,a4,a5,a6,Trigger兩個:Eachrow和Statement,都是before insert&upate


目的; test中六個欄位a1,a2,a3,a4,a5,a6都必須是unique的,並且這六個欄位中的任何一個值都不允許出現在其他任何ROW的六個欄位中.不管是insert還是update都不被允許.


嘗試; 在before insert&update的時候觸發trigger,用:new.a1 (a2,a3,a4....)去比對目前table裡面所有行六個欄位中是否有相同的值.由於Eachrow trigger裡面無法對本表進行查詢,而statement trigger裡面無法使用:new,所以,我在eachrow trigger裡面把:new.a1.....等存入六個變量(這六個變量存在於一個package裡面),然後在statement trigger裡面讀取這些變量,然後拿來查詢當前表中是否有這些值已經存在.


問題: trigger建好第一次達到目的,從此以後無論insert或者update任何值,都會被trigger攔截.通過debug發現,只要package裡面的變量一次被賦值,就再也無法被重置.問題好像是先觸發了statement trigger,此時變量還為空,所以查詢表沒有發現重複紀錄,順利insert&update,然後觸發了eachrow trigger,結果把更新的數據放入變量裡面.Well...從此以後變量裡面永遠都是這次被賦的值;每次insert&update任何紀錄都被statement trigger攔截....

求助: 如果說確實是statement先於eachrow,那麼如何實現此功能?

感激涕零!在線等待高手!!

...全文
217 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
skyly07 2005-03-04
  • 打赏
  • 举报
回复
感謝zhaokeke2004(男人·海洋)!!我在考慮把Statement的trigger改成after.....然後更改相關的校驗語句試試看.......
skyly07 2005-03-04
  • 打赏
  • 举报
回复
回ashzs((可以包含中文字符)) :目前我們就是這樣做的,但是客戶明確提到,要做到不可以寫語句直接UPDATE.
skyly07 2005-03-04
  • 打赏
  • 举报
回复
回樓上,我們目前就是這樣在做,但是因為這些資料很重要,所以還要預防有人下語句 UPDATE 數據.客戶明確的提到這一點.
zhaokeke2004 2005-03-04
  • 打赏
  • 举报
回复
顺序:
1.执行before语句级触发器
2.对受语句影响的每一行
-- 执行before行级触发器
-- 执行DML语句
-- 执行after行级触发器
3.执行after语句级触发器
ashzs 2005-03-04
  • 打赏
  • 举报
回复
如果是这样,你就要在插入数据库之前在客户端程序中做一定的校验了。
skyly07 2005-03-04
  • 打赏
  • 举报
回复
我有考慮過,但是目前我們的系統對於這張表的操作太多,根本無法將所有的test換成臨時表.並且我也沒有權利做這麼大的改動.呵呵....
lynx 2005-03-04
  • 打赏
  • 举报
回复
应该是statement先於eachrow
建议张完全一致的临时表,把eachrow trigger建在临时表上,然后通过该trigger把数据写到正式表中。
ashzs 2005-03-04
  • 打赏
  • 举报
回复
繁体不大明白,先复述一下你的问题:好像是为了辨别字段如a1等的值,在表中其他任何地方不能重复。
由于不用eachrow,将不能鉴别插入的记录的各个字段值是否重复,而用了eachrow就不能对表中已有
记录进行鉴别!
换一种思路:
你可以建立一个临时表!对临时表做eachrow触发器!你能够在对于这个临时表的触发器中首先鉴别
是否同一记录中各个字段值重复,然后还可以对你的数据表(test)进行查询,鉴别完毕后再插入到
test表中,你看这个可以吗?

17,089

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧