Here is a PL/SQL script to validate the database links accessible to an user. I wrote this to identify the working links after a database refresh or to verify links that connect from non-prod to prod…
Hope it helps…
REM Validate Database Links
REM Private links under connected user and Public links
REM
REM Biju Thomas - 29-Oct-2013
REM
set serveroutput on size 99999
set pages 0 lines 300 trims on
col spoolfile new_value spoolfname
select '/tmp/checklinks_'||user ||'_'||
substr(global_name, 1, instr(global_name,'.')-1)||
'.txt' spoolfile from global_name;
spool '&spoolfname'
declare
--
-- Get list of links the user has access to
cursor mylinks is select db_link, owner, created, host, username
from all_db_links;
--
-- Identify other links in the DB for information
cursor otherlinks is select db_link, owner
from dba_db_links
minus
select db_link, owner
from all_db_links;
dbname varchar2 (200);
currentuser varchar2 (30);
linkno number := 0;
begin
-- Current database and connected user
select name, user into dbname, currentuser from v$database;
dbms_output.put_line('Verifying Database Links '||currentuser||'@'||dbname);
dbms_output.put_line('========================================================');
--
for linkcur in mylinks loop
linkno := linkno + 1;
dbms_output.put_line('Checking Link: ' || linkno) ;
dbms_output.put_line('Link Name : ' || linkcur.db_link) ;
dbms_output.put_line('Link Owner : ' || linkcur.owner) ;
dbms_output.put_line('Connect User : ' || linkcur.username) ;
dbms_output.put_line('Connect To : ' || linkcur.host) ;
begin
--
-- Connect to the link to validate, get global name of destination database
execute immediate 'select global_name from global_name@"'||linkcur.db_link||'"' into dbname;
dbms_output.put_line('$$$$ DB LINK SUCCESSFULLY connected to '||dbname);
--
-- end the transaction and explicitly close the db link
commit;
execute immediate 'alter session close database link "'||linkcur.db_link||'"';
exception
--
-- DB Link connection failed, show error message
when others then
dbms_output.put_line('@@@@ DB LINK FAILED @@@@');
dbms_output.put_line('Error: '||sqlerrm);
end;
dbms_output.put_line('---------------------------------------');
dbms_output.put_line(' ');
end loop;
dbms_output.put_line('Tests Completed.');
--
-- List other Links in the DB
dbms_output.put_line('Other Private Links in the Database');
dbms_output.put_line('Connect as respective owner to validate these.');
dbms_output.put_line('----------------------------------------------');
for olinks in otherlinks loop
dbms_output.put_line(olinks.owner ||' :: '||olinks.db_link);
end loop;
end;
/
spool
spool off
set pages 99 lines 80 trims off
Sample Output:
Verifying Database Links APPS@TST
========================================================
Checking Link: 1
Link Name : CL.FE.NET
Link Owner : PUBLIC
Connect User : M_S_DBLINK
Connect To : prod
@@@@ DB LINK FAILED @@@@
Error: ORA-28000: the account is locked
ORA-02063: preceding line from CL
---------------------------------------
Checking Link: 2
...
...
...
---------------------------------------
Checking Link: 28
Link Name : EC1.E.NET
Link Owner : APPS
Connect User : QUERY
Connect To : (DESCRIPTION=(FAILOVER=yes)(LOAD_BALANCE=yes)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=B902A-VIP.e.net)(PORT=1532))(ADDRESS=(PROTOCOL=TCP)(HOST=B902B-VIP.e.net)(PORT=1532)))(CONNECT_DATA=(SERVICE_NAME=PROD)))
$$$$ DB LINK SUCCESSFULLY connected to PROD
---------------------------------------
Tests Completed.
Other Private Links in the Database
Connect as respective owner to validate these.
----------------------------------------------
SYSTEM :: CPROD.FE.NET
FQUERY :: GPROD2.FE.NET
FQUERY :: GASPRD.FE.NET
FQUERY :: PPROD.FE.NET
XXG :: PPROD.FE.NET
FQUERY :: SPROD.FE.NET
PL/SQL procedure successfully completed.
currently spooling to /tmp/checklinks_APPS_TST.txt