Oracle各類觸發器的使用執行個體____Oracle

來源:互聯網
上載者:User

最近在讀Oracle觸發器,試著編寫了幾個觸發器,還算實用,放在自己的資料庫中。現將其貼出來,並簡單講講觸發器的定義和使用。語言淺顯,絕對適合新手。

觸發器,簡單理解,就是當使用者進行某項操作時,會觸發的一段程式體,類似於爐石中的奧秘。我們可以利用這個特點來做一些很有趣的事。 一、DML觸發器 這類觸發器是指在進行insert、update或delete操作時觸發的程式體。如果你想在使用者對資料進行操作時,記錄或限制其操作,就可以用DML觸發器。 舉例來說,我想統計我的網站使用者的註冊、登出或者更新個人資訊等情況,我們就可以寫如下一個觸發器,每當有使用者進行上述操作時,觸發器會自動執行,並在log日誌表中儲存這些資訊。 上代碼:

create or replace trigger user_log before delete or insert or updateon usersfor each rowdeclareid number;beginselect count(*)+1 into id from ts_log_users t;if inserting then insert into ts_log_users t values (id,sysdate,(select count(*)+1 from ts_log_users t where t.class='create'),'create',:new.username);elsif deleting then insert into ts_log_users t values (id,sysdate,(select count(*)-1 from ts_log_users where class='create'),'delete',:new.username);else insert into ts_log_users t values (id,sysdate,(select t.count from ts_log_users t where create_date=(select max(t.create_date) from ts_log_users t)),'update',:new.username);end if;end;
第一行定義觸發器名字為user_log,create or replace意思是建立或如果存在一樣名字的觸發器則覆蓋。 第二行關鍵字可以選擇before和after,即操作前和操作後。比如我想查看使用者登入的ip情況,這時我們需要在使用者成功登入後觸發觸發器,所以需寫after。而這裡要對使用者的增刪改敏感,所以選擇before。後面是操作定義,即什麼樣的操作會觸發觸發器。 第三行on後面接表名,即當使用者對這個表進行操作時,觸發觸發器。另外,操作為update時,可寫成before uodate of 列名 on 表名,來使限制更加具體化。 第四行將觸發器定義為行級觸發器,即每當一行資料發生變化時,就觸發一次觸發器。比如我一下更新了三個使用者的資訊,那麼log日誌表中就會產生三條資料。如果不寫這句話,則觸發器只會在上述操作時,觸發一次,形成一條資料。 第五行聲明變數,用於儲存和操作一些可用資料。 從begin到end為程式主體,讀起來也很容易理解,主要有兩個操作,一是將log日誌的資料量+1作為資料id賦值給之前定義的id變數。賦值用into完成。 第二個操作是一個if操作,分別完成了對增刪改不同情況的處理。處理主要為想log日誌表插入資料,如果是建立使用者的話,則向log日誌表插入資料id(上面得到的)、系統時間、目前使用者數量(即count下log日誌中是create操作的資料)、操作類別(此處為create)以及操作的使用者名稱(:new.的意思就是新修改的資料,對比:old.使用,這兩個欄位在更新操作時會經常用到。例如將更新前的資料插入到另一表中,則用:old.表示,新插入的資料則用:new.操作)。後兩個是對delete和update的操作,類似上面不在贅述。 比如我現在向user表插入一條資料,在網站端即新註冊了一個使用者liuge:
insert into users values('liuge','password')


這時便會觸發上面的觸發器,在log日誌表形成一條記錄: 如果我更新一下liuge使用者的資訊呢,這時就會再出現一個操作記錄: 使用者沒有增加,因此count不變。如果我刪除這條記錄即登出這個使用者,這時log日誌插入這樣一條資料: 由於使用者被刪除,因此:new.找不到使用者名稱,也就沒有插入進資料。 你可以利用上面的log日誌表統計目前使用者數、每天新註冊人數以及流失使用者數等資訊,很實用。 二、替代觸發器 這類觸發器僅僅應用在視圖上。我舉個例子就明白這個觸發器的用處了。比如說,我提供給初級管理員老張一個視圖,只顯示使用者的基本註冊資訊,如使用者名稱、性別、民族等,而隱藏了使用者密碼、身高、體重這些私密資訊(這些資訊存在表中,老張看不到,因為我沒給他看錶的許可權)。但有一天有個走後門的找老張想把自己的資訊加到我資料庫中,於是老張就對視圖進行插入操作。可是問題來了,當插入一條關係戶資料到表中時,我們需要其使用者密碼、身高體重等(設定了不為空白),而老張看不到因此插不進去,因此報錯無法操作。所以這時我們就可以寫一個替代觸發器,即如果老張對視圖操作時,後面的表會自動插入一些隨機密碼等,以完成老張的視圖操作。觸發器定義格式類似於上面,這裡不再贅述(因為我沒用視圖,所以沒寫)。 三、系統觸發器 這類觸發器是在進行系統操作如startup、drop、alter、logon等時才會觸發的。 下面我寫一個,因為我的資料庫給了好多人使用,老張、老王等,而他們經常在別的時間和地點登入資料庫,我想看看這些登入情況,因此我寫一個登入的觸發器:
create or replace trigger oracle_user_log after logonon databasedeclareid number;beginselect count(*)+1 into id from ts_o_log_users t;insert into ts_o_log_users values (id,sys.login_user,sysdate,ora_client_ip_address);end;
這樣就可以查看使用者登入資料庫的資訊了:

四、其它 我們還可利用觸發器中的條件來限制某些操作,例如限制某個表的增刪改,或者限制在晚上什麼時間不允許插入資料(表現在網站即晚上不允許註冊新使用者)等等。 這是一個防止刪除users表的觸發器(未測試):
create or replace trigger nodrop_usersbefore drop on schemabeginif upper(sys.dictionary_obj_name)='USERS' then raise_application_error(-20005,'不能刪除此表。');end if;end;
通過修改if條件來完成各種限制操作,可以實現很多功能。至於那些sys.和ora.方法名,可以上網自行搜尋,找到合適自己的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.