ITPub博客

首页 > Linux操作系统 > Linux操作系统 > STREAMS笔记(6) rule

STREAMS笔记(6) rule

原创 Linux操作系统 作者:westzq1984 时间:2013-06-08 21:21:02 0 删除 编辑
rule 是Streams用来定义复制规则的东西

 

看一个简单的streams的capture的规则

 

SQL> @pt

Enter value for 1:  select * from dba_streams_schema_rules where streams_name=''O11203_CTAIS2_CAP$1''

old   2:    p_query         VARCHAR2(4000) := '&1';

new   2:    p_query         VARCHAR2(4000) := ' select * from dba_streams_schema_rules where streams_name=''O11203_CTAIS2_CAP$1''';

 

这个表只保留创建时的规则,一般查询规则不以此为准

 

-----------------

STREAMS_NAME                  : O11203_CTAIS2_CAP$1

STREAMS_TYPE                  : CAPTURE

SCHEMA_NAME                   : CTAIS2

RULE_TYPE                     : DML           -- DML触发,这个无意义,一切其实以RULE为准

INCLUDE_TAGGED_LCR            : YES          -- 复制所有LCR

SOURCE_DATABASE               : O11203

RULE_NAME                     : CTAIS2116

RULE_OWNER                    : STRMADMIN

RULE_CONDITION                : ((((:dml.get_object_owner() = 'CTAIS2') and

:dml.get_source_database_name() = 'O11203' )) and (:dml.get_compatible() <=

dbms_streams.compatible_11_2))                -- 这个只是创建时的RULE,以后修改RULE这个不变

-----------------

STREAMS_NAME                  : O11203_CTAIS2_CAP$1

STREAMS_TYPE                  : CAPTURE

SCHEMA_NAME                   : CTAIS2

RULE_TYPE                     : DDL           -- DDL触发

INCLUDE_TAGGED_LCR            : YES

SOURCE_DATABASE               : O11203

RULE_NAME                     : CTAIS2117

RULE_OWNER                    : STRMADMIN

RULE_CONDITION                : ((((:ddl.get_object_owner() = 'CTAIS2' or

:ddl.get_base_table_owner() = 'CTAIS2') and :ddl.get_source_database_name() =

'O11203' )) and (:ddl.get_compatible() <= dbms_streams.compatible_11_2))

-----------------

 

PL/SQL procedure successfully completed.

 

SQL> @pt

Enter value for 1: select * from DBA_STREAMS_RULES where rule_name in (''CTAIS2116'',''CTAIS2117'')

old   2:    p_query         VARCHAR2(4000) := '&1';

new   2:    p_query         VARCHAR2(4000) := 'select * from DBA_STREAMS_RULES where rule_name in (''CTAIS2116'',''CTAIS2117'')';

-----------------

STREAMS_TYPE                  : CAPTURE

STREAMS_NAME                  : O11203_CTAIS2_CAP$1

RULE_SET_OWNER                : STRMADMIN

RULE_SET_NAME                 : RULESET$_118  -- RULE加入RULE SET,在赋给一个STREAMS对象

RULE_OWNER                    : STRMADMIN

RULE_NAME                     : CTAIS2116

RULE_CONDITION                : ((((:dml.get_object_owner() = 'CTAIS2') and

:dml.get_source_database_name() = 'O11203' )) and (:dml.get_compatible() <=

dbms_streams.compatible_11_2))                -- 当前生效的RULE

RULE_SET_TYPE                 : POSITIVE      -- RULE的种类

STREAMS_RULE_TYPE             : SCHEMA

SCHEMA_NAME                   : CTAIS2

OBJECT_NAME                   :

SUBSETTING_OPERATION          :

DML_CONDITION                 :

INCLUDE_TAGGED_LCR            : YES

SOURCE_DATABASE               : O11203

RULE_TYPE                     : DML

MESSAGE_TYPE_OWNER            :

MESSAGE_TYPE_NAME             :

MESSAGE_RULE_VARIABLE         :

ORIGINAL_RULE_CONDITION       : ((((:dml.get_object_owner() = 'CTAIS2') and

:dml.get_source_database_name() = 'O11203' )) and (:dml.get_compatible() <=

dbms_streams.compatible_11_2))                -- 创建时的RULE

SAME_RULE_CONDITION           : YES

-----------------

STREAMS_TYPE                  : CAPTURE

STREAMS_NAME                  : O11203_CTAIS2_CAP$1

RULE_SET_OWNER                : STRMADMIN

RULE_SET_NAME                 : RULESET$_118

RULE_OWNER                    : STRMADMIN

RULE_NAME                     : CTAIS2117

RULE_CONDITION                : ((((:ddl.get_object_owner() = 'CTAIS2' or

:ddl.get_base_table_owner() = 'CTAIS2') and :ddl.get_source_database_name() =

'O11203' )) and (:ddl.get_compatible() <= dbms_streams.compatible_11_2))

RULE_SET_TYPE                 : POSITIVE

STREAMS_RULE_TYPE             : SCHEMA

SCHEMA_NAME                   : CTAIS2

OBJECT_NAME                   :

SUBSETTING_OPERATION          :

DML_CONDITION                 :

INCLUDE_TAGGED_LCR            : YES

SOURCE_DATABASE               : O11203

RULE_TYPE                     : DDL

MESSAGE_TYPE_OWNER            :

MESSAGE_TYPE_NAME             :

MESSAGE_RULE_VARIABLE         :

ORIGINAL_RULE_CONDITION       : ((((:ddl.get_object_owner() = 'CTAIS2' or

:ddl.get_base_table_owner() = 'CTAIS2') and :ddl.get_source_database_name() =

'O11203' )) and (:ddl.get_compatible() <= dbms_streams.compatible_11_2))

SAME_RULE_CONDITION           : YES

-----------------

 

默认创建的rule中,INCLUDE_TAGGED_LCR=YES,这会导致问题的,需要修改RULE,增加

 

exec DBMS_RULE_ADM.ALTER_RULE('CTAIS2116',condition=>'((((:dml.get_object_owner() = ''CTAIS2'') and :dml.get_source_database_name() = ''O11203'' )) and :dml.is_null_tag() = ''Y'' and (:dml.get_compatible() <= dbms_streams.compatible_11_2))')

 

exec DBMS_RULE_ADM.ALTER_RULE('CTAIS2117',condition=>'((((:ddl.get_object_owner() = ''CTAIS2'' or :ddl.get_base_table_owner() = ''CTAIS2'') and :ddl.is_null_tag() = ''Y'' and :ddl.get_source_database_name() =''O11203'' )) and (:ddl.get_compatible() <= dbms_streams.compatible_11_2))')

 

修改后的规则查询,在dba_streams_schema_rules中没有,直接以DBA_STREAMS_RULES.RULE_CONDITION列为准。没有找到其他修改INCLUDE_TAGGED_LCR的方法

 

如何添加一个RULE?

DBMS_STREAMS_ADM封装了添加RULE的方法,不需要写繁琐的表达式

 

BEGIN

DBMS_STREAMS_ADM.ADD_TABLE_RULES (

table_name         => '.',

streams_type       => 'capture',

streams_name       => 'O11203_CTAIS2_CAP$1',

queue_name         => 'STRMADMIN.O11203_CTAIS2_CAPQ$1',

include_dml        => true,     -- 添加一个取:dml变量的规则

include_ddl        => true,     -- 添加一个取:ddl变量的规则

include_tagged_lcr => false,       -- 添加 :dml/ddl.is_null_tag() = 'Y'

source_database    => 'O11203',

inclusion_rule    => false,        -- 加入positive还是 negative

and_condition      => null) ;   -- 添加额外的条件   

END;

/

 

当然,也可以手工创建

 

BEGIN

  DBMS_RULE_ADM.CREATE_RULE_SET (

    rule_set_name => 'STRMADMIN.CTAIS2_RULES',

    evaluation_context => 'SYS.STREAMS$_EVALUATION_CONTEXT');

END;

/

 

BEGIN

DBMS_RULE_ADM.CREATE_RULE(

rule_name => 'STRMADMIN.CTAIS2_DML',

condition => '((((:dml.get_object_owner() = ''CTAIS2'') and :dml.get_source_database_name() = ''O11203'' )) and :dml.is_null_tag() = ''Y'' and (:dml.get_compatible() <= dbms_streams.compatible_11_2))');

END;

/

 

BEGIN

  DBMS_RULE_ADM.ADD_RULE(

    rule_name => 'STRMADMIN.CTAIS2_DML',

    rule_set_name => 'STRMADMIN.CTAIS2_RULES');

END;

/

 

BEGIN

  DBMS_CAPTURE_ADM.ALTER_CAPTURE(

    capture_name =>'strm01_capture',

    rule_set_name =>'STRMADMIN.CTAIS2_RULES');

END;

/

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/8242091/viewspace-763554/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-04-06

  • 博文量
    251
  • 访问量
    1042183