替換觸發器,它的觸發時機是instead of,與其他型別觸發器不同的是,替換觸發器定義在檢視(一種資料庫物件)上的,而不是定義在表上。由於檢視是由多個基表連線組成的邏輯結構,所有一般不允許使用者進行dml操作(insert,update,delete等操作),這樣當使用者編寫替換觸發器後,對檢視操作實際上就變成了執行觸發器中的pl/sql操作。
先建立檢視
create view view_emp_dept
as select empno,ename,dept.deptno,dname,job,hiredate from emp,dept
where emp.deptno = dept.deptno;
注意:如果沒有建立view_emp_dept檢視,在沒有穿件「替換觸發器」之前,如果嘗試向該檢視中插入資料,就會報錯
ora-01776:無法通過聯接檢視修改多個基表
建立乙個關於view_emp_dept檢視insert事件中的觸發器
sql>create or replace trigger tri_insert_view
instead of insert
on view_emp_dept
for each row
declare
row_dept deptj%rowtype;
begin
select * into row_dept from dept where deptno = :new.deptno;
if sql%notfound then
insert into dept(deptno,dname) values (:new.deptno,:new,dname);
end if;
insert into emp(empno,enmae,deptno,job,hiredate) values
(:new.empno,:new.ename,:new.deptno,:new.job,:new.hiredate) ;
end tri_insert_view;
/
注意:new和:old分別是原值識別符號和新值識別符號,
如果乙個表有較多的列,使用%rowtype來定義乙個表示表中一行記錄的變數,比分別使用%type來定義表示表中各個列的變數要簡潔得多,並且不容易遺漏、出錯。這樣會增加程式的可維護性。
sql%notfound返回的資料型別是乙個布林值。布林值與前一條sql語句相關。當最近的一條sql語句沒有操作任何行的時候,返回true。否則返回false,而sql%found正好相反
接下來向檢視中插入資料:
insert into view_emp_dept (empno,ename,deptno,dname,job,hiredate)
values(8888,'東方',10,'accounting','cashier',sysdate);
PLSQL 除錯觸發器
在plsql裡是可以除錯觸發器的,相信有一部分人可能不清楚這個。以前我一直使用sql server,哈哈,養成了乙個根深蒂固的觀念,以為oracle裡觸發器也是不能除錯的,其實sqlserver裡面也是可以除錯的 寫這個的時候特意 在網上查詢了下資料 好了,為了形象說明,下面列舉個例子,如下圖所示,...
觸發器詳解
觸發器是乙個特殊的儲存過程,不同的是儲存過程要用call來呼叫,而觸發器不需要使用call 也不需要手工啟動,只要當乙個預定義的事件發生的時候,就會被mysql自動呼叫。建立觸發器 語法如下 create trigger trigger name trigger time trigger event...
觸發器詳解
mysql包含對觸發器的支援。觸發器是一種與表操作有關的資料庫物件,當觸發器所在表上出現指定事件時,將呼叫該物件,即表的操作事件觸發表上的觸發器的執行。建立觸發器 在mysql中,建立觸發器語法如下 如下 create trigger trigger name trigger time trigge...