MINI MINI MANI MO
Rem
Rem $Header: mgw/src/plsql/admin/mgwe102.sql /mgw_main/7 2008/08/24 09:37:36 chall Exp $
Rem
Rem mgwe102.sql
Rem
Rem Copyright (c) 2005, 2008, Oracle. All rights reserved.
Rem
Rem NAME
Rem mgwe102.sql - downgrade MGW component to 10.2.0 (from 11.1.0)
Rem
Rem DESCRIPTION
Rem Reverts data dictionary for MGW component to the 10.2.0 release.
Rem This script is run in the context of the "new" (11.1.0) database.
Rem
Rem NOTES
Rem This script must be run AS SYSDBA.
Rem
Rem MODIFIED (MM/DD/YY)
Rem chall 08/24/08 - 11.2 upgrade/downgrade support
Rem chall 11/20/06 - undo usage of dbms_crypto and RAW fields
Rem chall 10/11/06 - set OCI connection type as default for downgrade
Rem chall 09/29/06 - drop mgw_agent_options view, table
Rem chall 06/08/06 - downgrade actions for Scheduler feature
Rem chall 04/18/06 - comments field added to subscribers table
Rem chall 12/13/05 - Downgrade script to 10.2.0
Rem chall 12/13/05 - Created
Rem
Rem ==========================================================================
Rem For NNN+2 to NNN (11.2 to 10.2) downgrade, first perform the
Rem NNN+2 to NNN+1 (11.2 to 11.1) downgrade actions
@@mgwe111
Rem Now, perform the 11.1.0 to 10.2.0 downgrade actions
execute dbms_registry.downgrading('MGW');
rem ========================================================================
rem Clean schedule and subscriber entries that may have been affected by
rem the propagation job APIs added for 11gR1 (create_job, remove_job, etc).
rem
rem a) Drop all new-style propagation jobs (those created via create_job).
rem b) Clear certain job-related flags of schedule and subscriber entries.
rem
rem Tables affected:
rem mgw$_schedules, mgw$_subscribers
rem ========================================================================
-- delete all entries flagged as PROPJOB from schedules table
delete from sys.mgw$_schedules sch where (bitand(sch.flags, 2) = 2);
commit;
-- delete all entries flagged as PROPJOB from subscribers table
delete from sys.mgw$_subscribers sub where (bitand(sub.flags, 2) = 2);
commit;
-- clear DELETE_PENDING, PROPJOB, REMOVE_JOB bits of schedule flags
-- note: entries flagged as PROPJOB should have been deleted above
update sys.mgw$_schedules sch
set flags = sch.flags - bitand(sch.flags,1+2+4)
where (bitand(sch.flags, 1+2+4) != 0);
commit;
-- clear PROPJOB, REMOVE_JOB bits of subscriber flags
-- note: entries flagged as PROPJOB should have been deleted above
update sys.mgw$_subscribers sub
set flags = sub.flags - bitand(sub.flags,2+4)
where (bitand(sub.flags, 2+4) != 0);
commit;
rem ========================================================================
rem Drop MGW configuration for any named agents.
rem
rem Remove all MGW configuration associated with a named agent. This includes
rem any MGW configuration associated with links associated with a named agent.
rem
rem Drop other database objects associated with named agent; e.g., Scheduler
rem job class, Scheduler job, AQ notify queues, AQ log queues, and so on.
rem
rem No action needed for mgw$_agent_options table since the entire table
rem will be dropped later in the script. Also, the foreign key constraint
rem with ON DELETE CASCADE clause results in Oracle automatically removing
rem the associated rows when an agent is dropped from mgw$_gateway.
rem
rem When finished, MGW$_GATEWAY table should contain only one row for the
rem default agent.
rem
rem Also, drop any other Scheduler objects created by MGW. Includes the
rem Scheduler job class and job used for default agent. Drop Scheduler
rem program used for the startup job procedure.
rem
rem Tables affected:
rem mgw$_gateway, mgw$_foreign_queues, mgw$_subscribers, mgw$_schedules
rem ========================================================================
-- Drop a Scheduler object
--
-- p_which : 1=job, 2=job class, 3=program
-- p_name : name of object to be dropped
-- p_force : TRUE for a forced drop, FALSE for a non-forced drop
--
create or replace procedure mgwmig_drop_scheduler_obj (
p_which in pls_integer,
p_name in varchar2,
p_force in boolean default TRUE )
is
begin
begin
if p_which = 1 then -- ORA-27475 if no such job
dbms_scheduler.drop_job(p_name, p_force);
elsif p_which = 2 then -- ORA-27476 if no such job class
dbms_scheduler.drop_job_class(p_name, p_force);
elsif p_which = 3 then -- ORA-27476 if no such program
dbms_scheduler.drop_program(p_name, p_force);
else
dbms_output.put_line(
'mgwmig_drop_scheduler_obj: unknown value for p_which; '||p_which);
end if;
exception
when others then
if SQLCODE = -27475 then null;
elsif SQLCODE = -27476 then null;
else
dbms_output.put_line(
'mgwmig_drop_scheduler_obj: name='||p_name||', which='||p_which);
dbms_output.put_line(SQLERRM);
end if;
end;
end mgwmig_drop_scheduler_obj;
/
-- Determine MGW link referenced by a propagation triplet.
--
create or replace function mgwmig_link_refby (
p_prop_type in pls_integer,
p_source in varchar2,
p_destination in varchar2 )
return varchar2
is
v_link varchar2(30) := null;
-- parses string for the link portion
function i_getlink( str in varchar2 )
return varchar2
is
v_atpos pls_integer;
begin
v_atpos := instrb(str, '@');
if v_atpos > 0 then
return substrb(str, v_atPos+1);
else --%return ' ';
return null;
end if;
end i_getlink;
begin
if p_prop_type = 1 then -- outbound propagation
v_link := i_getlink(p_destination);
elsif p_prop_type = 2 then -- inbound propagation
v_link := i_getlink(p_source);
end if;
return v_link;
end mgwmig_link_refby;
/
-- Clean MGW configuration of all entites referencing given link name.
-- This commits the work after all entities for the link are removed.
--
-- For simplicity this attempts to remove an entry from MQSeries, TIB/Rv,
-- and MSMQ link table, where in fact, only one of them should have the link.
--
create or replace procedure mgwmig_clean_link_config ( p_linkname IN varchar2 )
is
v_linkname varchar2(30) := NLS_UPPER(p_linkname);
begin
begin
-- remove all references from schedules table
delete from sys.mgw$_schedules sch
where (mgwmig_link_refby(sch.prop_type,sch.source,sch.destination) =
v_linkname);
-- remove all references from subscribers table
delete from sys.mgw$_subscribers sub
where (mgwmig_link_refby(sub.prop_type,sub.queue_name,sub.destination) =
v_linkname);
-- remove all references from foreign queues table
delete from sys.mgw$_foreign_queues fq
where (fq.link_name = v_linkname);
-- remove all references from MQSeries link properties table
delete from sys.mgw$_mqseries_links lk
where (lk.link_name = v_linkname);
-- remove all references from TIB/Rv link properties table
delete from sys.mgw$_tibrv_links lk
where (lk.link_name = v_linkname);
-- remove all references from MSMQ link properties table
delete from sys.mgw$_msmq_links lk
where (lk.link_name = v_linkname);
-- remove link reference from mgw$_links
delete from sys.mgw$_links lk
where (lk.link_name = v_linkname);
commit;
exception
when others then
rollback;
raise;
end;
end mgwmig_clean_link_config;
/
-- Stop and drop an AQ queue.
--
-- If p_ignore_error is FALSE, this catches and discards only the exception
-- raised if the queue does not exist. Any other exception is not handled.
-- If TRUE, this ignores any exception and always attempts the operations.
--
create or replace procedure mgwmig_drop_queue (
p_queue in varchar2,
p_ignore_error in boolean default false )
is
-- no such AQ queue exists
e_NO_QUEUE_EXISTS exception;
pragma EXCEPTION_INIT(e_NO_QUEUE_EXISTS, -24010);
v_do_drop boolean := true; -- T=attempt to drop queue
begin
--%dbms_output.put_line('mgwmig_drop_queue: '||p_queue);
if not p_ignore_error then
-- only ignore if queue not exist, caller sees any other error
begin
dbms_aqadm.stop_queue(queue_name=>p_queue, wait=>true);
dbms_aqadm.drop_queue(queue_name=>p_queue, auto_commit=>true);
exception
when e_NO_QUEUE_EXISTS THEN
null;
--%dbms_output.put_line(
--% 'mgwmig_drop_queue: queue does not exist: '||p_queue);
end;
else
-- ignore all errors
v_do_drop := TRUE;
begin
dbms_aqadm.stop_queue(queue_name=>p_queue, wait=>true);
exception
when e_NO_QUEUE_EXISTS THEN
null;
v_do_drop := FALSE;
--%dbms_output.put_line(
--% 'mgwmig_drop_queue: queue does not exist: '||p_queue);
when others then
null;
--%dbms_output.put_line(
--% 'mgwmig_drop_queue: error stopping queue: '||p_queue);
--%dbms_output.put_line(SQLERRM);
end;
begin
if v_do_drop then
dbms_aqadm.drop_queue(queue_name=>p_queue, auto_commit=>true);
end if;
exception
when others then
null;
--%dbms_output.put_line(
--% 'mgwmig_drop_queue: error dropping queue:'||p_queue);
--%dbms_output.put_line(SQLERRM);
end;
end if;
end mgwmig_drop_queue;
/
-- Drop AQ notification queues and propagation log queues used by a MGW
-- named agent. This does not drop the underlying queue table.
--
-- If p_ignore_drop_error is FALSE, only the excecption raised if the
-- queue does not exist is ignored and any other exception is not caught.
-- If TRUE, any exception raised when attempting to drop a queue is
-- caught and ignored.
--
create or replace procedure mgwmig_drop_agent_queues (
p_agent in varchar2,
p_ignore_drop_error in boolean default false )
is
v_queue varchar2(61);
begin
-- command notification queue
v_queue := 'SYS.MGW_NFY_' || p_agent;
mgwmig_drop_queue(v_queue, p_ignore_error=>p_ignore_drop_error);
-- config notification queue
v_queue := 'SYS.MGW_CFG_' || p_agent;
mgwmig_drop_queue(v_queue, p_ignore_error=>p_ignore_drop_error);
-- notification response queue
v_queue := 'SYS.MGW_RSP_' || p_agent;
mgwmig_drop_queue(v_queue, p_ignore_error=>p_ignore_drop_error);
-- native inbound log queue
v_queue := 'SYS.MGW_ILOG_' || p_agent;
mgwmig_drop_queue(v_queue, p_ignore_error=>p_ignore_drop_error);
-- native outbound log queue
v_queue := 'SYS.MGW_OLOG_' || p_agent;
mgwmig_drop_queue(v_queue, p_ignore_error=>p_ignore_drop_error);
-- JMS inbound log queue
v_queue := 'SYS.MGW_JILOG_' || p_agent;
mgwmig_drop_queue(v_queue, p_ignore_error=>p_ignore_drop_error);
-- JMS outbound log queue
v_queue := 'SYS.MGW_JOLOG_' || p_agent;
mgwmig_drop_queue(v_queue, p_ignore_error=>p_ignore_drop_error);
end mgwmig_drop_agent_queues;
/
-- Drop extraneous database objects associated with a MGW named agent.
--
create or replace procedure mgwmig_drop_agent_objects ( p_agent IN varchar2 )
is
v_agent varchar2(30) := NLS_UPPER(p_agent);
begin
-- drop AQ queues (notify, log, etc) associated with agent; ignore errors
mgwmig_drop_agent_queues(v_agent, TRUE);
-- drop agent's Scheduler job and job class
mgwmig_drop_scheduler_obj(1, 'SYS.MGW_JOB_'||v_agent); -- job
mgwmig_drop_scheduler_obj(2, 'SYS.MGW_JOBCLS_'||v_agent); -- job class
end mgwmig_drop_agent_objects;
/
-- Remove all MGW configuration associated with a named agent.
--
create or replace procedure mgwmig_clean_agent_config ( p_agent varchar2 )
is
v_linkname VARCHAR2(30);
-- query for all links that reference a given named agent
CURSOR find_agent_links_c(p_agent varchar2) IS
select lk.link_name, lk.agent_name from sys.mgw$_links lk
where lk.agent_name = p_agent;
begin
FOR lk_rec IN find_agent_links_c(p_agent) LOOP
BEGIN
v_linkname := lk_rec.link_name;
--%dbms_output.put_line('mgwmig_clean_agent_config: '||
--% 'clean link config; link='||v_linkname||
--% ', agent='||lk_rec.agent_name);
mgwmig_clean_link_config(v_linkname);
EXCEPTION
WHEN OTHERS THEN
--%dbms_output.put_line(
--% 'mgwmig_clean_agent_config: error cleaning link '||v_linkname);
dbms_output.put_line(SQLERRM);
NULL;
END;
END LOOP;
END mgwmig_clean_agent_config;
/
-- Remove MGW configuration and database objects associated with named agents.
--
DECLARE
-- query for all MGW named agents
CURSOR find_named_agents_c IS
select gw.agent_name from sys.mgw$_gateway gw
where NVL(gw.agent_name, 'DEFAULT_AGENT') != 'DEFAULT_AGENT';
v_agent VARCHAR2(30);
BEGIN
FOR na_rec IN find_named_agents_c LOOP
v_agent := na_rec.agent_name;
BEGIN
--%dbms_output.put_line('removing config for MGW agent: '||v_agent);
mgwmig_clean_agent_config(v_agent);
--%dbms_output.put_line('dropping database objects for MGW agent: '||
--% v_agent);
mgwmig_drop_agent_objects(v_agent);
--commit;
EXCEPTION
WHEN OTHERS THEN
NULL;
--%dbms_output.put_line('error while cleaning MGW agent: '||v_agent);
--%dbms_output.put_line(SQLERRM);
END;
-- remove agent row in mgw$_gateway
delete from sys.mgw$_gateway where agent_name = v_agent;
commit;
END LOOP;
END;
/
-- Drop Scheduler job and job class used for default agent.
-- Drop Scheduler program used for MGW startup job procedure.
--
BEGIN
mgwmig_drop_scheduler_obj(1, 'SYS.MGW_JOB_DEFAULT_AGENT'); -- job
mgwmig_drop_scheduler_obj(2, 'SYS.MGW_JOBCLS_DEFAULT_AGENT'); -- job class
mgwmig_drop_scheduler_obj(3, 'SYS.MGW_STARTUP_PROGRAM'); -- program
END;
/
-- there should not be any links associated with a named agent
--%select link_name, agent_name from sys.mgw$_links
--% where NVL(agent_name, 'DEFAULT_AGENT') != 'DEFAULT_AGENT';
drop procedure mgwmig_clean_agent_config;
drop procedure mgwmig_drop_agent_objects;
drop procedure mgwmig_drop_agent_queues;
drop procedure mgwmig_drop_queue;
drop procedure mgwmig_clean_link_config;
drop function mgwmig_link_refby;
drop procedure mgwmig_drop_scheduler_obj;
rem ========================================================================
rem Restore encryption to that used for MGW 9i and 10g releases.
rem
rem mgwicry.plb, mgwicryb.plb specify a MGW encryption support package.
rem It is large of 11g but has minimal dependencies and can be loaded during
rem an downgrade as long as the underlaying MGW tables have 11g format from
rem a 11g upgrade or MGW 11g component install. That should be the case if
rem this script is being called so package should load fine.
rem
rem Tables affected:
rem mgw$_gateway, mgw$_mqseries_links
rem ========================================================================
-- load MGW encryption support package
-- unloaded later on so may not exist if script called multiple times
@@mgwicry.plb
@@mgwicryb.plb
--%exec dbms_output.put_line('------ mgw$_gateway before -----')
--%select agent_name, agent_password, enc_agent_password from sys.mgw$_gateway;
--%exec dbms_output.put_line('------ mgw$_mqseries_links before -----')
--%select link_name, password, enc_password from sys.mgw$_mqseries_links;
-- restore MGW encrypted data to that used prior to 11g
begin
-- agent password
update sys.mgw$_gateway
set agent_password =
sys.mgwi_crypto.migenc_11g_to_10g(enc_agent_password),
enc_agent_password = NULL
where enc_agent_password IS NOT NULL and agent_password IS NULL;
-- MQSeries password
update sys.mgw$_mqseries_links
set password = sys.mgwi_crypto.migenc_11g_to_10g(enc_password),
enc_password = NULL
where enc_password IS NOT NULL;
-- pre-11g implementation wound up storing an encypted NULL value for
-- link password. We should be okay if we skipped this part as well.
update sys.mgw$_mqseries_links
set password = sys.mgwi_crypto.encrypt_str_10g(NULL)
where password IS NULL;
-- skip sys.mgw$_msmq_links since not implemented for 10g and thus no data
commit;
exception
when others then
rollback;
raise;
end;
/
--%exec dbms_output.put_line('------ mgw$_gateway after -----')
--%select agent_name, agent_password, enc_agent_password from sys.mgw$_gateway;
--%exec dbms_output.put_line('------ mgw$_mqseries_links after -----')
--%select link_name, password, enc_password from sys.mgw$_mqseries_links;
-- package dropped later on in script
--%drop package sys.mgwi_crypto;
rem ========================================================================
rem Reverse Table Modifications
rem ========================================================================
rem --- Drop constraints added to MGW$_GATEWAY.
rem
ALTER TABLE mgw$_gateway
DROP CONSTRAINT mgw$_gateway_pk CASCADE;
ALTER TABLE mgw$_gateway
DROP CONSTRAINT mgw$_gateway_u1 CASCADE;
rem --- Set fields added for 11.1.0 to default values.
rem
update sys.mgw$_schedules
set link_name = null;
commit;
update sys.mgw$_subscribers
set link_name = null, comments = null;
commit;
update sys.mgw$_links
set agent_name = null;
commit;
update sys.mgw$_gateway
set job_instance_id=null, agent_name=null, service=null,
initfile=null, comments=null;
commit;
-- clear JDBC_DRIVER bit of agent flags to default to OCI
-- note: only default agent should remain since named agents deleted above
update sys.mgw$_gateway gw
set flags = gw.flags - bitand(gw.flags,1)
where (bitand(gw.flags, 1) != 0);
commit;
rem ========================================================================
rem Revoke various grants given.
rem ========================================================================
rem ========================================================================
rem Restore types to previous state
rem
rem CAUTION: Once a type has evolved by adding a new attribute, widening an
rem attribute, and so on, a CREATE OR REPLACE TYPE or ALTER TYPE REPLACE
rem _cannot_ be used to replace the type. An attempt to do so fails with:
rem ORA-22308: operation not allowed on an evolved type
rem The error is not displayed if database is opened as STARTUP MIGRATE and
rem it _appears_ the type is successfully replaced, but in fact, it remains
rem unchanged. Just adding/dropping type methods does not evolve the type.
rem
rem From 10.2 onward, MGW should _always_ use ALTER TYPE for any type
rem modifications and never replace the entire type. See additional notes
rem in mgwu101.sql script.
rem ========================================================================
-- mgwi_msglink
--
alter type sys.mgwi_msglink
DROP attribute m_agent
cascade;
rem ========================================================================
rem Drop types, packages, views, tables
rem ========================================================================
-- drop new views
drop view sys.mgw_agent_options;
drop public synonym mgw_agent_options;
drop view sys.mgw_jobs;
drop public synonym mgw_jobs;
-- drop new types
-- drop new packages
drop package sys.mgwi_crypto;
-- drop new tables
drop table sys.mgw$_config;
drop table sys.mgw$_agent_options;
rem ========================================================================
rem Downgrade complete
rem ========================================================================
execute dbms_registry.downgraded('MGW', '10.2.0');
Rem === End file: mgwe102.sql ================================================
OHA YOOOO