(Oracle)觸發器的相關知識與例項
觸發器
觸發器必須由事件觸發.
觸發事件分為3類:DML事件、DDL事件、資料庫事件。
觸發器分為4類:DML觸發器、DDL觸發器、資料庫事件觸發器、替代觸發器。
注:觸發器內不能使用commit,rollback,savepoint 語句,也不能直接或間接呼叫含有上述語句的儲存過程和儲存函式。
DML觸發器
例項1
先建立一個觸發事件記錄表event_record
create table event_record(
record_id number(10) primary key,
dml_name varchar2(15),
table_name varchar2(20),
time date,
user_name varchar2(20)
);
建立一個序列squ
create sequence squ increment by 1 start with 1 maxvalue 999999 nocycle nocache;
建立並編譯觸發器dml_log
create or replace trigger dml_log
before --在事件操作前觸發
insert or update or delete --觸發事件
on emp --觸發器定義在emp表上
for each row --行級觸發器
begin
if inserting then
insert into event_record values(squ.nextval,'INSERT','EMP',sysdate,user);
elsif updating then
insert into event_record values(squ.nextval,'UPDATE','EMP',sysdate,user);
else
insert into event_record values(squ.nextval,'delete','EMP',sysdate,user);
end if;
end;
現在你對emp表進行DML操作來驗證觸發器的作用吧!
例項2
建立一個觸發器change_sal,只能修改部門10的僱員工資
create or replace trigger change_sal
before
update of sal
on emp
for each row
begin
if :new.deptno!=10 then --注意new和old,它們放在可執行程式碼中要加:,放在when條件中不用加:。
raise_application_error(-20001,'您不能修改10號部門外的僱員工資!'); --用函式反饋錯誤資訊
end if;
end;
例項3
建立級聯刪除觸發器cascade_delete,當刪除dept表中的部門時,級聯刪除emp表中僱員資訊。
create or replace trigger cascade_delete
after --在事件操作後觸發
delete
on dept
for each row
begin
delete from emp where deptno=:old.deptno;
end;
例項4
建立一個語句級觸發器oprate_trigger,限定只能emp表進行修改操作,不能對資料庫進行插入和刪除。
create or replace trigger oprate_trigger
before
update or delete or insert
on emp --注意下面一行沒有for each row ,所以是語句級觸發器
begin
if updating then
insert into event_record values(squ.nextval,'UPDATE','EMP',sysdate,user);
else
raise_application_error(-20008,'您不能對emp表進行插入和刪除操作!');
end if;
end;
DDL觸發器
create or replace trigger nocreate_trigger
before
create
on schema --在當前模式
begin
raise_application_error(-20006,'您在當前模式下,不能建立任何物件!');
end;
資料庫事件觸發器
先建立一個表user_log
create table user_log(
user_name varchar2(20),
logon_time date,
logoff_time date
);
建立並編譯觸發器datebase_logon
create or replace trigger datebase_logon
after
logon
on schema --當前模式
begin
insert into user_log values(user,sysdate,'');
end;
建立並編譯觸發器datebase_logoff
create or replace trigger datebase_logoff
before
logoff
on schema --當前模式
begin
insert into user_log values(user,'',sysdate);
end;
替代觸發器
替代觸發器只能建立在檢視上,用來替代對檢視進行的插入、修改和刪除操作。
先建立一個檢視
create view emp_ename as select ename from emp;
建立並編譯觸發器change_ename
create or replace trigger change_ename
instead of --注意替代觸發器的用法
insert
on emp_ename
declare
v_empno emp.empno%type;
begin --注意裡面的程式,當遇到對檢視插入時,轉化為對錶的插入來達到對檢視插入的目的(因為empno為表的主鍵)
select max(empno)+1 into v_empno from emp;
insert into emp(empno,ename) values(v_empno,:new.ename);
end;
其他知識(以觸發器change_ename為例)
通過user_triggers檢視來檢視觸發器:select * from user_triggers;
使觸發器失效:alter trigger change_ename disable;
使觸發器生效:alter trigger change_ename enable;
刪除觸發器:drop trigger change_ename;
相關文章
- 例項總結Oracle知識點大全Oracle
- SQL觸發器例項講解SQL觸發器
- CAP 與 Raft 相關知識Raft
- Redis的相關知識Redis
- /proc的相關知識
- MySQL全面瓦解17:觸發器相關MySql觸發器
- WAP閘道器相關知識【轉】
- .net相關知識
- Shell相關知識
- RPM相關知識
- oracle資料庫與oracle例項Oracle資料庫
- 關於Python Number 相關的知識!Python
- Java與Mysql鎖相關知識總結JavaMySql
- SSL相關知識科普
- 音訊相關知識音訊
- Elasticsearch——search相關知識Elasticsearch
- redis相關知識點Redis
- Git相關知識點Git
- wifi認證的相關知識WiFi
- 儲存器資料恢復相關知識資料恢復
- RMAN備份相關知識與技能總結
- 如何系統的學習伺服器相關知識?伺服器
- Mysql的優化的相關知識MySql優化
- 混合開發之phonegap開發相關知識解析
- 相機成像相關知識總結
- 禁止oracle表的觸發器triggerOracle觸發器
- Java併發相關知識點梳理和研究Java
- 【Java】容器相關知識點Java
- ivar layout 相關知識點
- WEB相關背景知識(新手)Web
- RTMP協議相關知識協議
- Vlan相關知識雜記
- CT校正相關知識整理
- LR模型相關知識點模型
- 對JAVAWEB相關知識的學些JavaWeb
- clickhouse的一些相關知識
- 網站原始碼的相關知識網站原始碼
- jquery裡操作json相關的方法和例項jQueryJSON
- Python入門基礎知識例項,Python