在数据库迁移以后,生产开发库有500多个用户的dblink的ip地址需要变更,可以通过修改SYS.LINK$的方式来修改ip。
--更新SYS.LINK$的地址
UPDATE SYS.LINK$ SET HOST = REPLACE (HOST, :PRM_FROMIP, :PRM_TOIP)
WHERE INSTR(HOST, :PRM_FROMIPPRM_FROMIP) > 0;
--然后刷新共享池
ALTER SYSTEM CHECKPOINT;
ALTER SYSTEM FLUSH SHARED_POOL ;
一个完成的过程,另加上批量修改数据源的地址。(生产环境勿用)
--******************************************************************************
-- 过程名称 :PROCEDURE_IPCHANGE
-- 功能描述 : 将源数据库dblink的ip改为目标数据库的IP
--
-- 参数描述 :参数标识 名称 输入/输出 类型
-- -------------------------------------------------------------
-- PRM_FROMIP 源IP 输入 VARCHAR2
-- PRM_TOIP 目标IP 输出 VARCHAR2
--
-- 作 者 :li.chh 完成日期 :2013-03-26
---------------------------------------------------------------------------
-- 修改记录 :
--******************************************************************************
PROCEDURE PRC_IPCHANGE(PRM_FROMIP VARCHAR2, PRM_TOIP VARCHAR2) IS
V_SQL VARCHAR2(4000);
BEGIN
--更改dblink 的地址
UPDATE SYS.LINK$
SET HOST = REPLACE(HOST, PRM_FROMIP, PRM_TOIP)
WHERE INSTR(HOST, PRM_FROMIP) > 0;
--更改datasorce的ip地址
FOR REC_USER IN (SELECT OWNER || '.' || TABLE_NAME TABNAME
FROM DBA_TABLES
WHERE TABLE_NAME = UPPER('drm_sys_datasource')) LOOP
V_SQL := 'update ' || REC_USER.TABNAME ||
' SET DBURL=REPLACE(DBURL,:1,:2) WHERE INSTR(DBURL, :3) > 0';
-- DBMS_OUTPUT.PUT_LINE(V_SQL);
execute immediate v_sql using PRM_FROMIP,PRM_TOIP,PRM_FROMIP;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;