-- 建立mv測試表
create
table
tbl1
( a number,
b varchar2 (20)
);
create
unique
index
tbl1_pk
ontbl1 (a);
alter
table
tbl1
add(
constraint
tbl1_pl
primary
key(a));
-- 建立mv日誌,單一表聚合檢視的快速重新整理需要指定including new values子句
create
materialized
view
log
ontbl1 including new
values
; -- 建立mv
create
materialized
view
mv_tbl1
build immediate
refresh fast
start with
to_date(
'2013-06-01 08:00:00'
,'yyyy-mm-dd hh24:mi:ss'
) next
sysdate + 1/24
asselect
* from
tbl1;
-- 建立trigger測試表
create
table
mv_tbl1_tri
( a number,
b varchar
(20),
c varchar
(20)
);
-- 建立trigger
create
orreplace
trigger
tri_mv
after
delete
orinsert
orupdate
onmv_tbl1
referencing new as
new old
asold
foreach row
begin
case
when
inserting
then
insert
into
mv_tbl1_tri
values
(:new.a, :new.b,
'insert'
);
when
updating
then
insert
into
mv_tbl1_tri
values
(:new.a, :new.b,
'update'
);
when
deleting
then
insert
into
mv_tbl1_tri
values
(:old.a, :old.b,
'delete'
);
endcase
; exception
when
others
then
raise;
endtri_mv;
/ -- 新增mv測試表資料
insert
into
tbl1
values
(1,
'測試資料1'
);
insert
into
tbl1
values
(2,
'測試資料2'
);
insert
into
tbl1
values
(3,
'測試資料3'
);
commit
; select
* from
tbl1;
select
* from
mlog$_tbl1;
-- 生成3條「i」mv日誌記錄
-- 手工重新整理mv
exec
dbms_mview.refresh(
'mv_tbl1'
);
-- 重新整理mv,觸發3條insert,清空mv日誌
select
* from
mlog$_tbl1;
-- 檢查trigger測試表
select
* from
mv_tbl1_tri;
-- 修改mv測試表資料
update
tbl1
seta = 13
where
a = 3;
update
tbl1
seta = 3
where
a = 13;
update
tbl1
seta = 13
where
a = 3;
update
tbl1
seta = 3
where
a = 13;
update
tbl1
seta = 13
where
a = 3;
update
tbl1
seta = 13
where
a = 13;
update
tbl1
seta = 13
where
a = 13;
update
tbl1
setb =
'測試資料13'
where
a = 13;
update
tbl1
setb =
'測試資料3'
where
a = 13;
update
tbl1
setb =
'測試資料13'
; commit
; select
* from
tbl1;
select
* from
mlog$_tbl1;
-- 對每條記錄的update生成2條mv日誌記錄:當主鍵發生改變時,記錄一對「d」、「i」型記錄,表示先刪除後插入;當主鍵不變時,記錄一對「u」、「u」型記錄,分別表示新值和舊值;
-- 手工重新整理mv
exec
dbms_mview.refresh(
'mv_tbl1'
);
-- 重新整理mv,對mv日誌進行歸併處理,對每乙個主鍵,只執行其歸併後結果的操作
select
* from
mlog$_tbl1;
-- 檢查trigger測試表
select
* from
mv_tbl1_tri;
-- 對修改後的新主鍵13的所有後續修改只觸發了1條insert;
delete
from
tbl1;
-- 生成3條「d」mv日誌記錄
commit
; select
* from
tbl1;
select
* from
mlog$_tbl1;
-- 手工重新整理mv
exec
dbms_mview.refresh(
'mv_tbl1'
);
-- 重新整理mv,觸發3條delete,清空mv日誌
select
* from
mlog$_tbl1;
-- 檢查trigger測試表
select
* from
mv_tbl1_tri;
/***
結論
1. 在mv上可以建立觸發器
2. mv觸發器基於重新整理時間點的mv日誌歸併結果,在一些場景(只要記錄兩次重新整理時間點資料的差異,不需要記錄兩次重新整理之間的歷史變化)可以簡化應用處理。
***/
建立觸發器
視覺化資料庫工具 對於 microsoft sql server 資料庫,可以在 transact sql 中編寫觸發器,而對於 oracle 資料庫,則可以在 pl sql 中進行編寫。通過指定下列內容建立觸發器 建立觸發器 在 伺服器資源管理器 中,展開 表 資料夾。右擊要在其上建立觸發器的表名...
建立觸發器
create trigger trigger insert test1 on test2 after insert asbegin set nocount on added to prevent extra result sets from interfering with select state...
建立觸發器
create or replace trigger tg student after insert or update or delete on student foreach row declare 定義變數 begin 記錄日誌的程式 操作型別 case when inserting then ...