Oracle9i流環境清除(二)

yangtingkun發表於2007-11-17

Oracle的文件上給出了流環境的配置過程,但是沒有給出如何才能徹底清除流環境。

這篇文章介紹一下流環境中傳播環境的清除過程。

Oracle9i流環境清除(一):http://yangtingkun.itpub.net/post/468/414098


首先確保所有於PROPAGATION相關的JOB已經停止,而且流應用過程已經根據上一篇的文章進行了清除。

檢查一下系統中的傳播配置:

SQL> SELECT PROPAGATION_NAME, RULE_SET_NAME FROM ALL_PROPAGATION;

PROPAGATION_NAME RULE_SET_NAME
------------------------------ ------------------------------
DATA_TO_REPORT RULESET$_144

SQL> SELECT RULE_SET_NAME, RULE_SET_EVAL_CONTEXT_OWNER, RULE_SET_EVAL_CONTEXT_NAME FROM USER_RULE_SETS
2 WHERE RULE_SET_NAME = 'RULESET$_144';

RULE_SET_NAME RULE_SET_EVAL_CONTEXT_OWNER RULE_SET_EVAL_CONTEXT_NAME
------------------------------ ------------------------------ ------------------------------
RULESET$_144 SYS STREAMS$_EVALUATION_CONTEXT

SQL> SELECT RULE_NAME FROM USER_RULES;

RULE_NAME
------------------------------
CAT_AREA_QUALITY_DEFINE143
CAT_AREA_QUALITY_DEFINE166
CAT_BUYER146
.
.
.
USER_DISTRICT165
USER_DISTRICT188

44 rows selected.

SQL> SELECT STREAMS_NAME, RULE_NAME FROM SYS.STREAMS$_RULES WHERE STREAMS_NAME = 'DATA_TO_REPORT';

STREAMS_NAME RULE_NAME
------------------------------ ------------------------------
DATA_TO_REPORT CAT_AREA_QUALITY_DEFINE143
DATA_TO_REPORT CAT_BUYER_DISTRICT145
DATA_TO_REPORT CAT_BUYER146
.
.
.
DATA_TO_REPORT PLT_PLAT164
DATA_TO_REPORT USER_DISTRICT165

22 rows selected.

有了清除APPLY的經驗,PROPAGATION的清除就比較簡單了。

首先使用DBMS_STREAMS_ADM包來去掉流環境中配置的PROPAGATION規則:

SQL> SELECT 'EXEC DBMS_STREAMS_ADM.REMOVE_RULE(''' || RULE_NAME || ''', ''PROPAGATION'', ''DATA_TO_REPORT'')'
2 FROM SYS.STREAMS$_RULES
3 WHERE STREAMS_NAME = 'DATA_TO_REPORT';

'EXECDBMS_STREAMS_ADM.REMOVE_RULE('''||RULE_NAME||''',''PROPAGATION'',''DATA_TO_REPORT'')'
--------------------------------------------------------------------------------------------
EXEC DBMS_STREAMS_ADM.REMOVE_RULE('CAT_AREA_QUALITY_DEFINE143', 'PROPAGATION', 'DATA_TO_REPORT')
EXEC DBMS_STREAMS_ADM.REMOVE_RULE('CAT_BUYER_DISTRICT145', 'PROPAGATION', 'DATA_TO_REPORT')
.
.
.
EXEC DBMS_STREAMS_ADM.REMOVE_RULE('PLT_PLAT164', 'PROPAGATION', 'DATA_TO_REPORT')
EXEC DBMS_STREAMS_ADM.REMOVE_RULE('USER_DISTRICT165', 'PROPAGATION', 'DATA_TO_REPORT')

22 rows selected.

SQL> EXEC DBMS_STREAMS_ADM.REMOVE_RULE('CAT_AREA_QUALITY_DEFINE143', 'PROPAGATION', 'DATA_TO_REPORT')

PL/SQL procedure successfully completed.

利用SQL生成指令碼,然後透過REMOVE_RULE過程進行刪除。這裡需要注意,REMOVE_RULE過程中的RULE_TYPE型別應該為PROPAGATION,而不是文件上給出的PROPAGATE

確認所有流配置的PROPAGATION規則已經被清除掉了。

SQL> SELECT STREAMS_NAME, RULE_NAME FROM SYS.STREAMS$_RULES WHERE STREAMS_NAME = 'DATA_TO_REPORT';

no rows selected

下面清除掉PROPAGATION

SQL> EXEC DBMS_PROPAGATION_ADM.DROP_PROPAGATION('DATA_TO_REPORT')

PL/SQL procedure successfully completed.

SQL> SELECT * FROM ALL_PROPAGATION;

no rows selected

然後清除掉已經沒有作用的RULE_SETRULESET$_144

SQL> EXEC DBMS_RULE_ADM.DROP_RULE_SET('RULESET$_144', TRUE)

PL/SQL procedure successfully completed.

SQL> SELECT * FROM USER_RULE_SETS WHERE RULE_SET_NAME = 'RULESET$_144';

no rows selected

檢查RULE,發現規則並沒有被清除掉,這時候可以透過關聯SYS.STREAMS$_RULES將已經沒有使用的RULE刪除掉,不過為了保險起見,可以等到刪除CAPTURE資訊的時候,再將所有的RULE一起刪除掉。

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

相關文章