欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Oracle觸發(fā)器的使用詳解

 更新時(shí)間:2025年06月09日 09:19:00   作者:雷神樂(lè)樂(lè)  
這篇文章主要介紹了Oracle觸發(fā)器的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1.Oracle觸發(fā)器簡(jiǎn)介

觸發(fā)器的定義就是說(shuō)某個(gè)條件成立的時(shí)候,觸發(fā)器里面所定義的語(yǔ)句就會(huì)被自動(dòng)的執(zhí)行。

因此觸發(fā)器不需要人為的去調(diào)用,也不能調(diào)用。

觸發(fā)器的觸發(fā)條件,其實(shí)在定義的時(shí)候就已經(jīng)設(shè)定好了。

這里面需要說(shuō)明一下:觸發(fā)器可以分為語(yǔ)句級(jí)觸發(fā)器和行級(jí)觸發(fā)器。

簡(jiǎn)單的說(shuō)就是:

  • 語(yǔ)句級(jí)的觸發(fā)器可以在某些語(yǔ)句執(zhí)行前或執(zhí)行后被觸發(fā);
  • 而行級(jí)觸發(fā)器則是在定義的了觸發(fā)的表中的行數(shù)據(jù)改變時(shí)就會(huì)被觸發(fā)一次。

2.語(yǔ)句級(jí)觸發(fā)器和行級(jí)觸發(fā)器具體舉例

  • 在一個(gè)表中定義的語(yǔ)句級(jí)的觸發(fā)器,當(dāng)這個(gè)表被刪除時(shí),程序就會(huì)自動(dòng)執(zhí)行觸發(fā)器里面定義的操作過(guò)程。這個(gè)就是刪除表的操作就是觸發(fā)器執(zhí)行的條件了。
  • 在一個(gè)表中定義了行級(jí)的觸發(fā)器,那當(dāng)這個(gè)表中一行數(shù)據(jù)發(fā)生變化的時(shí)候,比如刪除了一行記錄,那觸發(fā)器也會(huì)被自動(dòng)執(zhí)行了。

3.觸發(fā)器的語(yǔ)法

create [or replace] TRIGGER 觸發(fā)器名 
觸發(fā)時(shí)間 觸發(fā)事件
on 表名
[for each row]
begin
 pl/sql語(yǔ)句
end

語(yǔ)法參數(shù):

  • 觸發(fā)器名:觸發(fā)器對(duì)象的名稱。由于觸發(fā)器是數(shù)據(jù)庫(kù)自動(dòng)執(zhí)行的,因此該名稱只是一個(gè)名稱,沒(méi)有實(shí)質(zhì)的用途。
  • 觸發(fā)時(shí)間:指明觸發(fā)器何時(shí)執(zhí)行,該值可?。?/li>
  • before:表示在數(shù)據(jù)庫(kù)動(dòng)作之前觸發(fā)器執(zhí)行;
  • after:表示在數(shù)據(jù)庫(kù)動(dòng)作之后觸發(fā)器執(zhí)行。
  • 觸發(fā)事件:指明哪些數(shù)據(jù)庫(kù)動(dòng)作會(huì)觸發(fā)此觸發(fā)器:
  • insert:數(shù)據(jù)庫(kù)插入會(huì)觸發(fā)此觸發(fā)器;
  • update:數(shù)據(jù)庫(kù)修改會(huì)觸發(fā)此觸發(fā)器;
  • delete:數(shù)據(jù)庫(kù)刪除會(huì)觸發(fā)此觸發(fā)器。
  • 表 名:數(shù)據(jù)庫(kù)觸發(fā)器所在的表。
  • for each row:對(duì)表的每一行觸發(fā)器執(zhí)行一次。如果沒(méi)有這一選項(xiàng),則只對(duì)整個(gè)表執(zhí)行一次。
-- 禁用觸發(fā)器
ALTER trigger t_1 ENABLE;

-- 啟用觸發(fā)器
ALTER trigger t_1 DISABLE;

---刪除觸發(fā)器
DROP trigger t_1;

4.語(yǔ)句級(jí)觸發(fā)器案例

在修改表emp之前觸發(fā),目的是不允許在星期四修改表

---RAISE_APPLICATION_ERROR 是觸發(fā)一個(gè)異常報(bào)錯(cuò)指令
---RAISE_APPLICATION_ERROR(自定義的一個(gè)異常碼,異常說(shuō)明)
select to_char(sysdate,'DY') FROM DUAL; -- 星期四

create or replace trigger t_1
  before update or insert or delete 
  -- 語(yǔ)句觸發(fā)器,它將在 EMP 表的 INSERT、UPDATE 或 DELETE 操作之前觸發(fā)。
on emp  -- 指定觸發(fā)器應(yīng)用于 EMP 表
  for each row
begin
  if to_char(sysdate, 'DY') = '星期四' then
    RAISE_APPLICATION_ERROR(-20001, '不允許在星期四修改表emp');
  end if;
end;
 
-- 測(cè)試
insert into emp (empno, ename) values (1111, 'AA');

5.行級(jí)觸發(fā)器案例

創(chuàng)建觸發(fā)器,比較emp表中更新的工資不能比原來(lái)的工資低

create table emp_sal as select * from emp;

create table emp_923 as select * from emp where 1=2;

create or replace trigger emp_sal_comp_sal_trigg
  before update on emp_sal
  for each row
begin
  if :old.sal > :new.sal then
    RAISE_APPLICATION_ERROR(-20002, '工資不能比之前少');
  else
    insert into emp_923 (empno, sal) values (:old.empno, :old.sal);
  end if;
end;
  • :old.和:new.不能出現(xiàn)在表級(jí)觸發(fā)器中
  • commit不能放在觸發(fā)器中
select * from emp_sal;

---修改 EMP_SAL 的數(shù)據(jù),看看是否會(huì)觸發(fā)異常
update emp_sal set sal=4000 where empno=7788;
commit;

修改成功后,emp_923表中會(huì)存入舊值:

select * from emp_923;

修改的工資比原來(lái)更低:

update emp_sal set sal=1000 where empno=7788;
commit;

拋出異常:

測(cè)試刪除的觸發(fā)器:

CREATE TABLE EMP_819 AS SELECT * FROM EMP;

CREATE OR REPLACE TRIGGER EMP819_DELETE
  BEFORE DELETE ON EMP_819
  FOR EACH ROW
BEGIN
  ---在刪除數(shù)據(jù)之前往 EMP_923 這張備份表里插入要被刪除的數(shù)據(jù)
  INSERT INTO EMP_923
    (EMPNO, ENAME, SAL)
  VALUES
    (:OLD.EMPNO, :OLD.ENAME, :OLD.SAL);
END;

----驗(yàn)證觸發(fā)器
DELETE FROM EMP_819 T WHERE T.EMPNO = 7788;
COMMIT;
---驗(yàn)證數(shù)據(jù)
SELECT * FROM EMP_819;

SELECT * FROM EMP_923;

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論