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...