在MV上建立觸發器實驗

2021-07-25 16:11:07 字數 4326 閱讀 4679

-- 建立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 ...