oracle小知識點6--oracle dml觸發器的fire_once_only屬性

selectshen發表於2015-09-08
      一般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程式終止.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28539951/viewspace-1794688/,如需轉載,請註明出處,否則將追究法律責任。

相關文章