資料庫程式設計入門 三 觸發器的應用

2021-07-24 20:38:22 字數 3954 閱讀 9919

create or replace trigger 觸發器名

before | after

delete | insert | update [of 列名]

on 表名

[for each row [when 條件]] -- 行級觸發器 或 語句級觸發器

plsql程式塊

在指定的操作語句操作之前或之後執行一次,不管這條語句影響了多少行 -- 針對的是表

觸發語句作用的每一條記錄都被觸發。在行級觸發器中使用 :old 和 :new 偽記錄變數,識別值的狀態。-- 針對的是行

create or replace trigger say_hi_to_new_user

after insert

on tb_user

declare

begin

dbms_output.put_line('hello new user...');

end;

/insert into tb_user(no,name,salary,job,hiredate,deptno) values(10,'nikobelic',5000,'manager',sysdate,20);

輸出

1行已插入。

hello new user...

create or replace trigger time_check

before insert

on tb_user

declare

begin

if to_char(sysdate,'day') in ('星期六','星期日') or

to_number(to_char(sysdate,'hh24')) not between 9 and 17 then

end if;

end;

/insert into tb_user(no,name,salary,job,hiredate,deptno) values(11,'nikobelic',5000,'manager',sysdate,20);

輸出:

錯誤報告 -

sql 錯誤: ora-20001: 禁止在非工作時間插入新員工

ora-06512: 在 "learn.time_check", line 7

ora-04088: 觸發器 'learn.time_check' 執行過程中出錯

/*

觸發器案例2:資料的確認

漲後工資不能少於漲前工資

1. :old ,:new 代表同一條記錄

2. :old 表示操作該行之前,這一行的值

:new 表示操作改行之後,這一行的值

*/create or replace trigger check_salary

before update

on tb_user

for each row

begin

-- if 漲後的工資 < 漲前的工資 then

if :new.salary < :old.salary then

end if;

end;

/update tb_user t set t.salary = t.salary - 100 where t.no = 1;

輸出:錯誤報告 -

sql 錯誤: ora-20002: 漲後工資比漲前工資還低?滾!

ora-06512: 在 "learn.check_salary", line 3

ora-04088: 觸發器 'learn.check_salary' 執行過程中出錯

/*

觸發器應用場景三:資料庫的審計 -->基於值的審計功能

給員工漲工資,當漲後薪資超過6000時,審計該員工資訊

*/create table tb_audit(

infomation varchar2(200)

);create or replace trigger audit_user

after update

on tb_user

for each row

begin

-- 當漲後工資超過6000時,插入審計資訊

當給員工漲完工資後,自動備份新的工資到備份表中

建立備份表

此案例結合儲存過程鎖,可以有效防止高併發問題。

create or replace trigger check_repeat

before insert

on tb_user

for each row

declare

cursor cur_user is select name from tb_user;

pname tb_user.name%type;

begin

open cur_user;

loop

fetch cur_user into pname;

exit when cur_user%notfound;

dbms_output.put_line(pname);

if :new.name = pname then

end if;

end loop;

end;

/insert into tb_user(no,name,salary,job,hiredate,deptno) values(12,'zhangyu',5000,'manager',sysdate,20);

輸出在行: 23 上開始執行命令時出錯 -

insert into tb_user(no,name,salary,job,hiredate,deptno) values(12,'zhangyu',5000,'manager',sysdate,20)

錯誤報告 -

sql 錯誤: ora-20003: 該使用者已經被儲存過了

ora-06512: 在 "learn.check_repeat", line 12

ora-04088: 觸發器 'learn.check_repeat' 執行過程中出錯

資料庫應用 Sqlserver觸發器

下面講在sql sever2000 sybase資料為里設定觸發器的指令碼例項 sql sever2000和sybase的儲存語句是相同的 題目要求 表1和表2的主鍵都是xjh 學籍號 當表1新增,刪除,或者修改資料時,表2自動更新,請用觸發器實現它們?答案 建議在資料庫管理中心直接執行ddl的sq...

資料庫觸發器

觸發器是一種特殊型別的儲存過程,它不同於我們前面介紹過的儲存過程。觸發器主要是通過事件進行觸發而被執行的,而儲存過程可以通過儲存過程名字而 被直接呼叫。當對某一表進行諸如update insert delete 這些操作時,sql server 就會自動執行觸發器所定義的sql 語句,從而確保對資料...

資料庫觸發器

最近做了個觸發器的例子 create trigger tru user on user for update asif update status begin update user set stopflag 1 from inserted where user.userid inserted.us...