oracle小知識點6--oracle dml觸發器的fire_once_only屬性
一般oracle dml觸發器的fire_once_only屬性為true,這樣普通使用者程式執行dml操作時,rdbms去啟用它們,但在logical standby的sql apply程式中是自動禁用,
這樣保證了logical standby和主庫資料的一致性.當然也可以把觸發器的fire_once_only屬性改為false,這樣sql apply程式也會啟用它們.
之前客戶的一個報表系統,透過logicalstandby實現,降低了主庫的查詢壓力.但客戶希望能將一些不需要的表遮蔽掉,將某些的欄位脫敏.遮蔽表可以透過dbms_logstdby.skip
實現.將某些欄位進行脫敏,就需要用到觸發器這個fire_once_only屬性了.
以下演示:
db version:11.2.0.4
--1.在主庫建立測試表
create table SCOTT.DEPT
(
deptno NUMBER(2) not null,
dname VARCHAR2(21),
loc VARCHAR2(20)
);
alter table SCOTT.DEPT
add constraint PK_DEPT primary key (DEPTNO) using index ;
--2.在主庫SCOTT.DEPT表上建立用於脫敏的觸發器
--用sys使用者給scott賦予dbms_logstdby包的許可權.
grant execute on dbms_logstdby to scott;
--透過dbms_logstdby.is_apply_server()來避免在主庫上執行
create or replace trigger scott.trg_dept
before insert or update on scott.dept
for each row
begin
if dbms_logstdby.is_apply_server() then
:new.dname := 'abc';
end if;
end;
--3.在主庫上將觸發器的fire_once_only屬性設定為false
begin
dbms_ddl.set_trigger_firing_property('scott','trg_dept',false);
end;
--4.驗證
--在主庫中插入資料
insert into scott.dept
select 1,'dev','bj' from dual;
commit;
--在備庫中檢視資料
select * from SCOTT.DEPT t;
/*
DEPTNO DNAME LOC
1 abc bj
*/
備註:
1.測試中發現dbms_ddl.set_trigger_firing_property('scott','trg_dept',false);要在建完觸發器之後就要執行.如果觸發器建完,已經有一些對該表的dml操作,再執行
dbms_ddl.set_trigger_firing_property不生效.這時可以disable備庫上這個觸發器,再enable備庫上這個觸發器,就可以生效.
2.透過觸發器實現這個功能要注意考慮因為主備表中某些欄位不致導致備庫上sql apply程式終止.
這樣保證了logical standby和主庫資料的一致性.當然也可以把觸發器的fire_once_only屬性改為false,這樣sql apply程式也會啟用它們.
之前客戶的一個報表系統,透過logicalstandby實現,降低了主庫的查詢壓力.但客戶希望能將一些不需要的表遮蔽掉,將某些的欄位脫敏.遮蔽表可以透過dbms_logstdby.skip
實現.將某些欄位進行脫敏,就需要用到觸發器這個fire_once_only屬性了.
以下演示:
db version:11.2.0.4
--1.在主庫建立測試表
create table SCOTT.DEPT
(
deptno NUMBER(2) not null,
dname VARCHAR2(21),
loc VARCHAR2(20)
);
alter table SCOTT.DEPT
add constraint PK_DEPT primary key (DEPTNO) using index ;
--2.在主庫SCOTT.DEPT表上建立用於脫敏的觸發器
--用sys使用者給scott賦予dbms_logstdby包的許可權.
grant execute on dbms_logstdby to scott;
--透過dbms_logstdby.is_apply_server()來避免在主庫上執行
create or replace trigger scott.trg_dept
before insert or update on scott.dept
for each row
begin
if dbms_logstdby.is_apply_server() then
:new.dname := 'abc';
end if;
end;
--3.在主庫上將觸發器的fire_once_only屬性設定為false
begin
dbms_ddl.set_trigger_firing_property('scott','trg_dept',false);
end;
--4.驗證
--在主庫中插入資料
insert into scott.dept
select 1,'dev','bj' from dual;
commit;
--在備庫中檢視資料
select * from SCOTT.DEPT t;
/*
DEPTNO DNAME LOC
1 abc bj
*/
備註:
1.測試中發現dbms_ddl.set_trigger_firing_property('scott','trg_dept',false);要在建完觸發器之後就要執行.如果觸發器建完,已經有一些對該表的dml操作,再執行
dbms_ddl.set_trigger_firing_property不生效.這時可以disable備庫上這個觸發器,再enable備庫上這個觸發器,就可以生效.
2.透過觸發器實現這個功能要注意考慮因為主備表中某些欄位不致導致備庫上sql apply程式終止.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28539951/viewspace-1794688/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- (Oracle)觸發器的相關知識與例項Oracle觸發器
- DML操作 DDL觸發器觸發器
- oracle事務知識點小結Oracle
- oracle小知識點9--cluvfyOracle
- oracle 歸檔日誌的小知識點Oracle
- javascript中關於value的一個小知識點(value既是屬性也是變數)JavaScript變數
- Oracle_day1(小知識點)Oracle
- VEEAM的小知識點
- Hibernate【inverse和cascade屬性】知識要點
- CSS知識點之字型大小屬性font-sizeCSS
- oracle小知識點4--利用將欄位拆分成多個屬性實現order by複雜排序Oracle排序
- java小知識點Java
- js小知識點JS
- 小知識點1
- 前端小知識點前端
- mongo 小知識點Go
- javascript小知識點JavaScript
- PHP小知識點PHP
- SQL Server約束和DML觸發器的比較SQLServer觸發器
- 網路安全知識點中,Cookie有哪些安全屬性?Cookie
- 記錄的小知識點
- oracle小知識點1--varchar2的長度Oracle
- 浮點數小知識點
- Oracle知識小記Oracle
- Oracle觸發器Oracle觸發器
- Oracle觸發器觸發級別Oracle觸發器
- oracle小知識點2--一致性讀中的重啟動更新Oracle
- 微信小程式開發知識點總結微信小程式
- 【JAVA】- 知識點小結Java
- promise知識點小結Promise
- CSS小知識點一CSS
- HTTP知識點小結HTTP
- makefile 知識點小結
- ElasticSearch知識點小記Elasticsearch
- 總結的小知識點(一)
- 開發Webview的技術,小的技術知識點WebView
- 知識點:可變陣列的屬性使用copy修飾的後果陣列
- 【必知必會的MySQL知識】③DML語言MySql