類型 行級觸發器: FOR EACH ROW 影響的每一行都會執行觸發器 語句級出發器 預設的模式,一句話才執行一次觸發器 觸發器不能嵌套,不能含有事務控制語句 何時觸發 Before:條件運行前 After:條件運行後 Instead of:替代觸發,作用在視圖上 創建觸發器 實例一 1.創建一個 ...
類型
行級觸發器:
- FOR EACH ROW
影響的每一行都會執行觸發器
語句級出發器
- 預設的模式,一句話才執行一次觸發器
觸發器不能嵌套,不能含有事務控制語句
何時觸發
- Before:條件運行前
- After:條件運行後
- Instead of:替代觸發,作用在視圖上
創建觸發器
實例一
1.創建一個與scott下的emp表結構一樣的表emp_his,並不添加數據
create table emp_his as select * from employees where 0=1;
這種構造與現存表相同結構的表,是不會將comment帶過來的
2.然後在emp表中創建before delete類型的觸發器,
當即將刪除emp表記錄時,將相應記錄插入到emp_his中。
create or replace trigger hr.e_delete
before delete on employees
for each row
begin
insert into emp_his values(:old.employee_id,
:old.first_name,:old.last_name,:old.email,
:old.phone_number,:old.hire_date,:old.job_id,
:old.salary,:old.commission_pct,:old.manager_id,
:old.department_id);
end e_delete;
實例二
禁止對錶emp的salary進行更改
create or replace trigger e_update
before update of salary on emp
begin
if updating then
raise_application_error(-20001,'工資不能被改動');
end if;
end;
檢驗
hr@ORCL> update emp
2 set salary=100
3 where employee_id<100;
update emp
*
第 1 行出現錯誤:
ORA-20001: 工資不能被改動
ORA-06512: 在 "HR.E_UPDATE", line 3
ORA-04088: 觸發器 'HR.E_UPDATE' 執行過程中出錯
hr@ORCL>
觸發器管理
禁用觸發器
alter trigger e_delete disable;
禁用某個表上所有的觸發器
alter table emp disable all triggers;
查all_trigger表得到觸發器名字
select trigger_name,trigger_type,table_owner,table_name from all_triggers;
查看觸發器內容
select text from all_source where type='TRIGGER' and name='E_DELETE';
註意,平時在寫sql的時候不註意大小寫,但是在此處涉及到觸發器名字的時候一定要大寫
hr@ORCL> select text from all_source where type='TRIGGER' and name='E_DELETE';
TEXT
---------------------------------------------------------------------------------------------------------------------
trigger hr.e_delete
before delete on employees
for each row
begin
insert into emp_his values(:old.employee_id,
:old.first_name,:old.last_name,:old.email,
:old.phone_number,:old.hire_date,:old.job_id,
:old.salary,:old.commission_pct,:old.manager_id,
:old.department_id);
end e_delete;
已選擇11行。
hr@ORCL>
刪除觸發器
drop trigger e_delete_1;