oracle資料庫觸發器
① oracle資料庫,觸發器有什麼用途,請用實例說明一下。
觸發器和sequence
的使用
建表:
create
table
prd
(id
number
not
null
primary
key,
name
varchar2(20)
,
spec
varchar2(30)
)
建sequence
create
sequence
prd_seq
increment
by
1
start
with
1
nomaxvalue
nocycle
nocache
建觸發器
create
or
replace
trigger
prd_trig
before
insert
on
prd
for
each
row
when(new.id
is
null)
begin
select
mgssfcs.prd_seq.nextval
into
:new.id
from
al;
select
sysdate
into
:new.datetime
from
al;
--不能直接用update或insert語句輸入
end;
作用:對某一個表或資料庫進行操作時,觸發器內的代碼開始執行:
可以為本表自動輸入其它欄位的值,也可以對別的表進行新增,刪除,更新等各種操作。
② oracle中觸發器都有幾種
oracle中觸發器有三種
1.DML觸發器
ORACLE可以在DML語句進行觸發,可以在DML操作前或操作後進行觸發,並且可以對每個行或語句操作上進行觸發。
2 .替代觸發器
由於在ORACLE里,不能直接對由兩個以上的表建立的視圖進行操作。所以給出了替代觸發器。它就是ORACLE 8專門為進行視圖操作的一種處理方法。
3. 系統觸發器
ORACLE 8i 提供了第三種類型的觸發器叫系統觸發器。它可以在ORACLE資料庫系統的事件中進行觸發,如ORACLE系統的啟動與關閉等。
③ Oracle資料庫觸發器的組成是怎樣的
Oracle觸發器用法實例詳解
本文實例講述了Oracle觸發器用法。分享給大家供大家參考,具體如下:
一、觸發器簡介
觸發器的定義就是說某個條件成立的時候,觸發器裡面所定義的語句就會被自動的執行。
因此觸發器不需要人為的去調用,也不能調用。
然後,觸發器的觸發條件其實在你定義的時候就已經設定好了。
這裡面需要說明一下,觸發器可以分為語句級觸發器和行級觸發器。
詳細的介紹可以參考網上的資料,簡單的說就是語句級的觸發器可以在某些語句執行前或執行後被觸發。而行級觸發器則是在定義的了觸發的表中的行數據改變時就會被觸發一次。
具體舉例:
1、 在一個表中定義的語句級的觸發器,當這個表被刪除時,程序就會自動執行觸發器裡面定義的操作過程。這個就是刪除表的操作就是觸發器執行的條件了。
2、 在一個表中定義了行級的觸發器,那當這個表中一行數據發生變化的時候,比如刪除了一行記錄,那觸發器也會被自動執行了。
二、觸發器語法
觸發器的語法:
create[orreplace] tigger 觸發器名 觸發時間 觸發事件on表名[foreach row]beginpl/sql語句end其中:
觸發器名:觸發器對象的名稱。由於觸發器是資料庫自動執行的,因此該名稱只是一個名稱,沒有實質的用途。
觸發時間:指明觸發器何時執行,該值可取:
before:表示在資料庫動作之前觸發器執行;
after:表示在資料庫動作之後觸發器執行。
觸發事件:指明哪些資料庫動作會觸發此觸發器:
insert:資料庫插入會觸發此觸發器;
update:資料庫修改會觸發此觸發器;
delete:資料庫刪除會觸發此觸發器。
表 名:資料庫觸發器所在的表。
for each row:對表的每一行觸發器執行一次。如果沒有這一選項,則只對整個表執行一次。
觸發器能實現如下功能:
功能:
1、 允許/限制對表的修改
2、 自動生成派生列,比如自增欄位
3、 強制數據一致性
4、 提供審計和日誌記錄
5、 防止無效的事務處理
6、 啟用復雜的業務邏輯
來源:網頁鏈接
④ oracle 資料庫的觸發器
create or replace trigger add_b_to_c
after insert on A
for each row
begin
if inserting then
insert into C(欄位1,欄位2,......) select 欄位1,欄位2,...... from B where <你的關聯條件>
end if;
end;
/
這個就是對的呀
⑤ Oracle資料庫觸發器問題
你怎麼界定哪些是新導入的呢?因為你說每次導入都把舊數據刪除,你這次導入數據之後,對於下一次導入,你上一次的就是舊數據,所以應該刪除也是沒錯的。
然後你這樣寫因為你的delete from a;是寫在觸發器裡面,每導入一次 都會觸發一次,所以A表每次都只會保留一條數據。
我有個建議就是把每天最新一天的數據當做新數據,這樣你在觸發器刪除的時候可以加個日期判斷,如果是當天的數據 就不刪除,delete from a where date<>'今天日期'
⑥ oracle觸發器怎麼寫
創建觸發器,給觸發器命名,在哪個表上的增刪改進行觸發,是否為行級觸發
編寫你的邏輯
編譯檢查是否有語法錯誤啥的
測試,這里的話,就是你某一個工種的最低工資增加,那屬於這個工種的員工中原來是最低工資的也要增加,所以你要先把工種中最低工資查出來,根據工種號,查詢屬於該工種的人有哪些,把這些員工的工資查出來,再修改工種的最低工資,再查員工工資是否也增加了。
你這表也沒有,我門也沒有辦法給你寫一個很詳細的。大致思路一般是這樣
⑦ Oracle 中的觸發器有幾種
ORACLE資料庫有四種觸發器,分別是DML、Instead-of、DDL、DB觸發器,一般的應用系統中都是用到DML、Instead-of觸發器,DDL、DB兩種觸發器是DBA管理資料庫用得比較多
四種觸發器分別有不同的作用
一、DML觸發器:當發出UPDATE、INSERT、DELETE命令就可以觸發已定義好的DML觸發器,是最簡單和常用的一種觸發器
語法:
create
or
replace
trigger
trigger_name
after|before
insert|update|delete
on
table_name
for
each
row
二、Instead-of觸發器:當向一個由多個表聯接成的視圖作DML操作時,一般情況下是不允許的,這時候就可以用Instead-of觸發器來解決這種問題(在觸發器寫代碼分別對各表作相應DML操作),語法是這樣的:
create
or
replace
trigger
trigger_name
instead
of
insert|update|delete
on
view_name
for
each
row
三、DDL觸發器:當發出CREATE、ALTER、DROP、TRUNCATE命令時會觸發已定義好的DDL觸發器,這種觸發器可以用來監控某個用戶或整個資料庫的所有對象的結構變化
語法:
create
or
replace
trigger
trigger_name
before|after
create|alter|drop|truncate
on
schema|database
例:
--禁止用CREATE、ALTER、DROP、TRUNCATE命令操作APPS用戶的對象
create
or
replace
trigger
apps_no_ddl
before
create
or
alter
or
drop
or
truncate
on
apps
begin
raise_application_error(-20001,'不允許用DDL操作APPS用戶的對象');
end;
四、DB事件觸發器:當STARTUP、SHUTDOWN、LOGON、LOGOFF資料庫時就會觸發DB事件觸發器,這種觸發器可以用來監控資料庫什麼時候關閉/打,或者用戶的LOGON/LOGOFF資料庫情況
語法:
create
or
replace
trigger
trigger_name
before|after
startup|shutdown|logon|logoff
on
database
例:
--記錄資料庫關閉的時間(shutdown類型要用關鍵字before,startup用after)
create
or
replace
trigger
db_shutdown
before
shutdown
on
database
begin
insert
into
test_tbl(log_event)
values('db
shutdown
at
'||to_char(sysdate,'yyyy-mm-dd
hh24:mi:ss'));
commit;
end;
--記錄用戶LOGON時間(logoff類型要用關鍵字before,logon用after)
create
or
replace
trigger
user_logon_db
after
logon
on
database
begin
insert
into
test_tbl(username,logon_time)
values(user,to_char(sysdate,'yyyy-mm-dd
hh24:mi:ss'));
commit;
end;
注意:要創建DDL和DB事件這兩種觸發器必須要有DBA的許可權才行
⑧ oracle資料庫觸發器
典型的變異表問題。
select corcode into corcodeID from organization where codeitemid = (select parentid from organization where codeitemid =:old.codeitemid) ;
個人覺得沒有必要。
直接在下面調用
INSERT INTO T_ORG_MID(CODEITEMID,CODEITEMDESC,PARENTID,GRADE,A0000,FLAG,ID) VALUES(:NEW.Corcode,:NEW.CODEITEMDESC,:old.corcode,:NEW.GRADE,:NEW.A0000,2,ORG_ID.NEXTVAL);
把裡面的corcodeID改為:old.corcode
就行了。你看一下是否符合你的業務邏輯。