PL/SQL 07 觸發器 trigger
--觸發器
觸發器有三類:
資料操作觸發器
用before觸發器進行資料校驗
用after觸發器進行級聯操作
語句觸發器限制資料的操作和記錄操作日誌
instead of 觸發器(只針對檢視不允許DML操作時)
資料定義觸發器
監視資料庫中使用者的一些重要操作
系統觸發器
--觸發器的限制
不應該使用事務控制語句
COMMIT, ROLLBACK, SAVEPOINT
由觸發器呼叫的任何過程與函式都不能使用事務控制語句
不能宣告任何LONG或LONG RAW變數
可以訪問的表有限
變化表
被DML語句正在修改的表,亦即定義觸發器的表
限制表
有些表在建立的時候就帶有參考完整性限制的宣告
主鍵與外來鍵
觸發器主體中的限制
不可以讀取或修改任何變化表
不可以讀取或修改限制表的主鍵,唯一值列,外來鍵列
--資料操作觸發器
create or replace trigger 觸發器名字
before/after insert/update/delete
on 表名/檢視名
for each row
declare
變數定義;
begin
程式碼;
end;
--for each row為行級觸發器,去掉為語句級觸發器
:new.欄位 資料操作後的內容
:old.欄位 資料操作前的內容
--禁止向t_score表中新增微機原理的成績
create or replace trigger trg_insert_sco
before insert
on t_score
for each row
declare
coursename t_course.coursename%type;
begin
select coursename
into coursename
from t_course
where courseno=:new.courseno;
if coursename='微機原理' then
raise_application_error(-20001,'該課程已經考試結束,不能新增成績記錄');
end if;
end;
--當學生表中新增一條記錄時,自動為此學生新增高等數學期中成績,分數設為null
create or replace trigger trg_insert_stu
after insert
on t_student
for each row
begin
insert into t_score
values(:new.stuno,'期中',(select courseno
from t_course
where coursename='高等資料'),null);
end;
--語句觸發器
--禁止8:00到18:00對成績表進行操作
create or replace trigger trg_ope_sco
before insert or update or delete
on t_score
begin
if (to_char(sysdate,'hh24:mi') not between '8:00' and '18:00')
then
raise_application_error(-20004,'不能再非工作時間對t_score表進行操作');
end if;
end;
--instead of 觸發器
--對於含有連線或子查詢的檢視,一般無法進行DML操作,可以用instead of 觸發器實現
create or replace trigger 觸發器名字
instead of insert/update/delete
on 檢視名
for each row
declare
變數定義;
begin
程式碼;
end;
create or replace trigger trg_update_vw_cou_tea
instead of update
on vw_cou_tea
for each row
declare
tno t_teacher.teano%type;
begin
select teano
into tno
from t_teacher
where teaname=:new.teaname;
update t_course
set teano=tno
where coursename=:old.coursename;
end;
--資料定義語言觸發器
create or replace trigger 觸發器名字
before/after 使用者事件
on database|schema
declare
變數定義;
begin
程式碼;
end;
--使用者事件包括create、alter、drop、使用者登入login等
--禁止使用者刪除資料庫物件
create or replace trigger trg_drop
before drop
on schema
begin
raise_application_error(-20005,'不能刪除');
end;
--觸發器(OEM)
create trigger bmbtrigger
before insert or update or delete
on bmb
begin
if(to_char(sysdate,'DAY'))='SUN'
then
RAISE_APPLICATION_ERROR(-20600,'you can not update table on weekend.');
end if;
end;
create or replace trigger gzbtrigger
after insert or update or delete
on gzb
declare suminconme number
begin
select sum(income) into sumincome from gzb;
if sumincome<50000
then
raise_application_error(-20001,'收入低於2萬');
end if;
end;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27633655/viewspace-1080404/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Mysql之觸發器triggerMySql觸發器
- MySQL入門-- TRIGGER(觸發器)MySql觸發器
- SQLite建立觸發器 CREATE TRIGGERSQLite觸發器
- oracle trigger觸發器這servererrorOracle觸發器ServerError
- 禁止oracle表的觸發器triggerOracle觸發器
- SQL觸發器SQL觸發器
- pl/sql 07-13SQL
- SQL Server 觸發器SQLServer觸發器
- 建立SQL觸發器SQL觸發器
- SQL Server觸發器SQLServer觸發器
- SQL觸發器(二)SQL觸發器
- PL/SQL程式設計接觸SQL程式設計
- 【SQL Server】-- 一觸即發之觸發器SQLServer觸發器
- sql-server觸發器SQLServer觸發器
- Sql Server系列:觸發器SQLServer觸發器
- [MySQL光速入門]026 觸發器 trigger!!!MySql觸發器
- SQL Server:觸發器詳解SQLServer觸發器
- SQL總結(六)觸發器SQL觸發器
- oracle trigger觸發器審計schema物件的變更ddlOracle觸發器物件
- Oracle 過程(Procedure)、函式(Function)、包(Package)、觸發器(Trigger)Oracle函式FunctionPackage觸發器
- 瞭解SQL Server觸發器及觸發器中的事務AWSQLServer觸發器
- SQL Sever 2000中的前觸發器和後觸發器SQL觸發器
- SQL觸發器例項講解SQL觸發器
- SQL Server 觸發器詳情HOPPSQLServer觸發器
- SQL server觸發器簡單示例SQLServer觸發器
- sql2000觸發器SQL觸發器
- 淺入淺出SQL Server 觸發器SQLServer觸發器
- 淺談SQL Server觸發器的使用SQLServer觸發器
- SQL資料庫觸發器例項SQL資料庫觸發器
- 關於SQL SERVER觸發器的理解SQLServer觸發器
- 觸發器中獲取SQL語句觸發器SQL
- 使用after create 建立trigger記錄procedure PL/SQL程式碼變更SQL
- 為什麼trigger()無法觸發hover事件事件
- SQL Server資料庫級別觸發器SQLServer資料庫觸發器
- SQL Server 觸發器的修改與刪除SQLServer觸發器
- sql triggerSQL
- PL/SQL開發記錄SQL
- Oracle觸發器觸發級別Oracle觸發器