oralce觸發器中更新本表的方法

2021-12-29 22:08:12 字數 1070 閱讀 8631

oralce觸發器中更新本表的方法

[sql] 

-- create table  

create table test_up_tri  

(    id   number,  

name varchar2(20),  

age  number(2)  

)   

中如何更新a表的其他字段。

舉例說明:

為該錶建立乙個觸發器,功能是:當name欄位發生改變時,將age欄位設定為20,觸發器如下:

[sql] 

create or replace trigger testtab_up_tri before update of name on test_up_tri  

for each row  

declare  

begin  

:new.age :=20;  

end;  

測試如下圖所示:

下面來解釋文章開頭提出的兩個問題:

1,after和before的區別。

乙個是在記錄操作之前觸發,乙個是在記錄操作之後觸發。

比如表之間定義的有外來鍵,在刪除主鍵時,必須要先刪除外來鍵表,這時就有先後之分,after是在修改觸發語句影響的每行和可能應用相應的完整性約束後,若不違反觸發器限制則為當前行執行觸發器動作,與before行觸發器不同的是,after行觸發器鎖住行。因此,after中不可以使用:new.age : = 20這樣的語句。

2,使用update…set來更新本表是不可以的只能使用:new :=**的方式,如果使用了可以編譯通過,但執行時,會出現如下錯誤:

ora-04091: 表 zxl.test_up_tri 發生了變化, 觸發器/函式不能讀它

ora-06512: 在 "zxl.testtab_up_tri", line 5

ora-04088: 觸發器 'zxl.testtab_up_tri' 執行過程**錯

3,:new :=**的方式也可以使用select 20 into :new.age來代替,這樣當我們查到乙個欄位是可以直接通過select ……into :new.age的方式直接更新確定的字段。

mysql 更新本表觸發器

例項 create definer root trigger jq jq jam event t before update before update on jq jam event t for each row begin if new.duration 120 then set new.zt ...

觸發器的更新本表(由迴圈觸發引起的思考)

這是昨天做資料庫的時候遇到的乙個問題 更新本表造成觸發迴圈 為了方便敘述,只列出部分屬性。我有乙個關係模式 bbsuser uid,uname,uclass,upointn uid 使用者id uname 使用者名稱 ulevel 使用者級別 upointn 使用者積分 我給定乙個需求 更新使用者積...

觸發器的更新

如何用一條sql語句,同時更新兩個表中的資料 2009年01月03日 星期六 17 34 用觸發器 在a表建更新b表對應資料的觸發器 這樣a表更新了,相應b表資料也會更新 如有a表,欄位id int name varchar 50 b表,欄位id int namebak varchar 50 先建a...