激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術|

服務器之家 - 數(shù)據(jù)庫 - Oracle - Oracle 觸發(fā)器trigger使用案例

Oracle 觸發(fā)器trigger使用案例

2022-02-24 22:08夜光小兔紙 Oracle

Oracle觸發(fā)器是使用者對Oracle數(shù)據(jù)庫的對象做特定的操作時,觸發(fā)的一段PL/SQL程序代碼器,觸發(fā)器分為語句級觸發(fā)器和行級觸發(fā)器,本文通過案例給大家介紹觸發(fā)器使用,感興趣的朋友跟隨小編一起看看吧

 

一、觸發(fā)器定義

Oracle觸發(fā)器是使用者對Oracle數(shù)據(jù)庫的對象做特定的操作時,觸發(fā)的一段PL/SQL程序代碼器。觸發(fā)的事件包括對表的DML操作,用戶的DDL操作以及數(shù)據(jù)庫事件等。

 

二、觸發(fā)器分類

觸發(fā)器分為語句級觸發(fā)器和行級觸發(fā)器。

  • 語句級觸發(fā)器:在某些語句執(zhí)行前或執(zhí)行后被觸發(fā)。
  • 行級觸發(fā)器:在定義了觸發(fā)器的表中的行數(shù)據(jù)改變時就會被觸發(fā)一次。

按照用戶具體的操作事件的類型,可以分為5種觸發(fā)器。

  • 數(shù)據(jù)操作(DML)觸發(fā)器:此觸發(fā)器是定義在Oracle表上的,當對表執(zhí)行insert、update、delete操作時可以觸發(fā)該觸發(fā)器。如果按照對表中行級數(shù)據(jù)進行觸發(fā)或語句級觸發(fā),又可以分為行級(row)觸發(fā)器,語句級觸發(fā)器,按照修改數(shù)據(jù)的前后觸發(fā)觸發(fā)器,又可以分為 after 觸發(fā)器和before觸發(fā)器之分。
  • 數(shù)據(jù)定義操作(DDL)觸發(fā)器:當對數(shù)據(jù)庫對象進行create、alter、drop操作時,觸發(fā)觸發(fā)器進行一些操作記錄保存、或者限定操作。
  • 用戶和系統(tǒng)事件觸發(fā)器:該類型的觸發(fā)器是作用在Oracle數(shù)據(jù)庫系統(tǒng)上,當進行數(shù)據(jù)庫事件時,觸發(fā)觸發(fā)器,一般用來記錄登錄的相關信息。
  • INSTEAD OF 觸發(fā)器:此類型的觸發(fā)器是作用在視圖上,當用戶對視圖進行操作時,觸發(fā)該觸發(fā)器把相關的操作轉(zhuǎn)換為對表進行操作。
  • 復合觸發(fā)器:指的是對數(shù)據(jù)操作(DML)觸發(fā)器當中的多種類型觸發(fā)器進行復合,比如;一個觸發(fā)器當中包含著after(或before)的行級觸發(fā)器和after(或before)的語句級觸發(fā)器,來完成一些更為復雜的操作。

 

三、觸發(fā)器功能

Oracle觸發(fā)器可以根據(jù)不同的數(shù)據(jù)庫事件進行特定的調(diào)用觸發(fā)器程序塊,因此,它可以幫助開發(fā)者完成一些PL/SQL存儲過程完成不了的問題,比如:

  • 允許or限制對表的修改
  • 自動生成派生列,比如自增字段(序列)
  • 強制數(shù)據(jù)一致性
  • 提供審計和日志記錄
  • 防止無效的事務處理
  • 啟用復雜的業(yè)務邏輯

但是不推薦在觸發(fā)器當中寫業(yè)務邏輯程序,因為這樣對后期數(shù)據(jù)的維護將大大提高成本。

 

四、觸發(fā)器語法

create [or replace] trigger 觸發(fā)器名稱 觸發(fā)時間 觸發(fā)事件
on 表名
[for each row]
begin
  PL/SQL語句塊
end;

語法解釋:
觸發(fā)器名稱:觸發(fā)器對象的名稱,沒有實際用途。
觸發(fā)時間:指定觸發(fā)器何時執(zhí)行,有before和after兩個值。
before:在數(shù)據(jù)庫動作之前執(zhí)行觸發(fā)器
after:在數(shù)據(jù)庫動作之后執(zhí)行觸發(fā)器
觸發(fā)事件:指明哪些數(shù)據(jù)庫動作會觸發(fā)該觸發(fā)器
insert 數(shù)據(jù)庫插入時會觸發(fā)該觸發(fā)器
update 數(shù)據(jù)庫更新時會觸發(fā)該觸發(fā)器
delete 數(shù)據(jù)庫刪除時會觸發(fā)該觸發(fā)器
表名:數(shù)據(jù)庫觸發(fā)器所在的表
for each row:對觸發(fā)器的執(zhí)行范圍做限定,對表的每一行觸發(fā)器執(zhí)行一次,如果沒有這個選項就是對整個表執(zhí)行一次

 

五、觸發(fā)器使用案例

 

案例1:向job1表中插入一條數(shù)據(jù)后輸出 歡迎加入 語句

--準備工作:拷貝jobs表為job11表,案例1和案例2均在job1表中執(zhí)行。
CREATE TABLE JOB1 AS SELECT * FROM HR.JOBS;
--創(chuàng)建觸發(fā)器
create or replace trigger trigger1 after insert
on job1
begin
  dbms_output.put_line("祝您早日漲薪!");
end;

觸發(fā)器創(chuàng)建完成后,可向job1表插入一行數(shù)據(jù)驗證效果。

--插入數(shù)據(jù),觸發(fā)觸發(fā)器的執(zhí)行
insert into job1 values("ruirui","Prisident",15000,30000);

效果如下:

Oracle 觸發(fā)器trigger使用案例

 

案例2:數(shù)據(jù)校驗,不允許星期二和星期四向emp1表中插入/更新數(shù)據(jù)。

create or replace trigger trigger2 before insert or update 
on job1
declare
  v_day varchar2(20);
begin
  ---判斷今天是否是星期二或星期四
  select to_char(sysdate,"day") into v_day from dual;
  ---判斷
  if v_day = "星期二" then
    dbms_output.put_line("今天是星期二,不能插入/更新數(shù)據(jù)!");
    raise_application_error(-20001,"今天是星期二,不能插入/更新數(shù)據(jù)!");
  if v_day = "星期四" then
    dbms_output.put_line("今天是星期四,不能插入/更新數(shù)據(jù)!");
    raise_application_error(-20001,"今天是星期四,不能插入/更新數(shù)據(jù)!");
  end if;
  end if;
end;

觸發(fā)器創(chuàng)建完成后,可向job1表插入一行數(shù)據(jù)驗證效果。

--插入數(shù)據(jù),觸發(fā)觸發(fā)器的執(zhí)行
insert into job1 values("rui1","Prisident",15000,30000);

效果如下:

Oracle 觸發(fā)器trigger使用案例

Oracle 觸發(fā)器trigger使用案例

 

案例3:創(chuàng)建觸發(fā)器,記錄表的刪除數(shù)據(jù)

--創(chuàng)建job1_log表用于記錄job1表的刪除記錄
create table job1_log  as select * from job1 where  1<>1;

--創(chuàng)建觸發(fā)器
create or replace trigger trigger3 after delete 
on job1
for each row
begin
  insert into job1_log values(:old.job_id,:old.job_title,:old.min_salary,:old.max_salary);
  dbms_output.put_line("記錄已經(jīng)成功刪除并記錄到日志");
end;

觸發(fā)器創(chuàng)建完成后,可刪除job1表一行數(shù)據(jù)驗證效果。

--測試
delete from job1 where job_id="ruirui";

效果如下:

Oracle 觸發(fā)器trigger使用案例

Oracle 觸發(fā)器trigger使用案例

 

案例4:創(chuàng)建觸發(fā)器,記錄表的更新數(shù)據(jù)

--創(chuàng)建日志記錄表
create table test_log(
  l_user varchar2(15),
  l_type varchar2(15),
  l_date varchar2(20)
);

--創(chuàng)建觸發(fā)器
create or replace trigger trigger4 after delete or insert or update
on job1
declare
  v_type test_log.l_type%type;
begin
  if deleting then
    v_type := "delete";
    dbms_output.put_line("記錄已經(jīng)成功刪除并記錄到日志");
  elsif inserting then
    v_type := "insert";
    dbms_output.put_line("記錄已經(jīng)成功插入并記錄到日志");
  elsif updating then
    v_type := "update";
    dbms_output.put_line("記錄已經(jīng)成功更新并記錄到日志");
  end if;
  insert into test_log values(user,v_type,to_char(sysdate,"yyyy-mm-dd hh24:mi:ss"));
end;

觸發(fā)器創(chuàng)建完成后,可更新job1表中數(shù)據(jù)驗證效果。

--測試
insert into job1 values("rui1","Prisident",15000,30000);

Oracle 觸發(fā)器trigger使用案例

update job1 set min_salary=20000 where job_id="rui1";

Oracle 觸發(fā)器trigger使用案例

delete from job1 where job_id="rui1";

Oracle 觸發(fā)器trigger使用案例

查詢test_log表中記錄如下:

select * from test_log;

Oracle 觸發(fā)器trigger使用案例

案例5:創(chuàng)建觸發(fā)器,在刪除某條數(shù)據(jù)之前先在記錄表插入該條數(shù)據(jù)

--創(chuàng)建job1_log表用于記錄job1表的刪除記錄
create table test1_log  as select * from job1 where  1<>1;

--創(chuàng)建觸發(fā)器
create or replace trigger trigger5 before delete on job1
for each row --行級觸發(fā)器
begin
  insert into test1_log values(:old.job_id,:old.job_title,:old.min_salary,:old.max_salary);
end;

觸發(fā)器創(chuàng)建完成后,可更新job1表中數(shù)據(jù)驗證效果。

--測試
delete from job1 where job_id="rui2";
commit;

查詢test1_log表中記錄如下:

select * from test01_log;

Oracle 觸發(fā)器trigger使用案例

參考:Oracle數(shù)據(jù)庫 觸發(fā)器

到此這篇關于Oracle 觸發(fā)器trigger概述的文章就介紹到這了,更多相關Oracle 觸發(fā)器trigger內(nèi)容請搜索服務器之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/Ruishine/article/details/123062646

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 双性帝王调教跪撅打屁股 | 午夜精品老牛av一区二区三区 | 久久久久久久久久网 | 午夜男人在线观看 | 92自拍视频 | 少妇一级淫片免费放正片 | 男女羞羞视频在线观看免费 | 99综合视频 | 国产精品探花在线观看 | 新久久久久久 | 天天夜夜草 | av免费在线观 | 亚洲极色 | 久久精品国产清自在天天线 | 羞羞视频免费网站男男 | 国产精品久久久久久久午夜片 | 色播亚洲 | 久久久久女人精品毛片九一 | 久综合| 色妞妞视频| 免费久久精品 | 中国av免费在线观看 | 亚洲性一区 | hdhdhd69ⅹxxx黑人 | 久久草草亚洲蜜桃臀 | 久久精品一区二区三区不卡牛牛 | av成人在线播放 | 精品亚洲福利一区二区 | 久久精品99国产国产精 | 免费看性xxx高清视频自由 | 性色av一区二区三区在线观看 | 手机黄色小视频 | 久精品久久 | 亚洲一区二区国产 | 久久久久久久一区二区三区 | 日本黄色一级视频 | 欧美精品一级 | 久久久久久久网站 | 老女人碰碰在线碰碰视频 | 久久久久久免费 | 毛片免费看网站 |