DROP DB_LINKS of a PRIVATE user from “SYS”
Create a procedure named “DROP_DBLINK” which will call values from “dba_users”, also which parse a cursor in it and it calls an inbuilt package also.
To drop a private DB_LINK either we need to change user password or we need to know user password, Instead of that we can drop DB_LINKS using this procedure.
Step 1:- Check the DB_LINK & Troubleshoot to drop
a) Check the existing DB_LINK of user “CKPT”.
SQL> show user USER is "SYS" SQL> SQL> select db_link,owner from dba_db_links where owner='CKPT' and db_link= ‘DEVWEBSTORE10G_IC.CKPT.COM’; DB_LINK OWNER ------------------------------ ------------------------------ DEVWEBSTORE10G_IC.CKPT.COM CKPT
b) Drop the DB_LINK from “SYS” user.
SQL> drop database link "CKPT"."DEVWEBSTORE10G_IC.CKPT.COM "; <---- Drop by using schema name with separation drop database link "CKPT"."DEVWEBSTORE10G_IC.CKPT.COM " * ERROR at line 1: ORA-02024: database link not found SQL> drop database link DEVWEBSTORE10G_IC.CKPT.COM; <---- Drop by using without schema name drop database link DEVWEBSTORE10G_IC.CKPT.COM * ERROR at line 1: ORA-02024: database link not found SQL> drop database link CKPT. DEVWEBSTORE10G_IC.CKPT.COM; <---- Drop by using without schema name using pointer drop database link CKPT. DEVWEBSTORE10G_IC.CKPT.COM * ERROR at line 1: ORA-02024: database link not found SQL>
C) Create a procedure as below from “SYS” user.
SQL> Create or replace procedure Drop_DbLink(schemaName varchar2, dbLink varchar2 ) is plsql varchar2(1000); cur number; uid number; rc number; begin select u.user_id into uid from dba_users u where u.username = schemaName; plsql := 'drop database link "'||dbLink||'"'; cur := SYS.DBMS_SYS_SQL.open_cursor; SYS.DBMS_SYS_SQL.parse_as_user( c => cur, statement => plsql, language_flag => DBMS_SQL.native, userID => uid ); rc := SYS.DBMS_SYS_SQL.execute(cur); SYS.DBMS_SYS_SQL.close_cursor(cur); end; / Procedure created. SQL>
D) Now drop one DB_LINK of a Private user
SQL> exec Drop_DbLink( 'CKPT', 'DEVWEBSTORE10G_IC.CKPT.COM' ); PL/SQL procedure successfully completed. SQL> SQL> select db_link,owner from dba_db_links where owner='CKPT' and db_link='DEVWEBSTORE10G_IC.CKPT.COM'; no rows selected SQL>
Here No DB_LINK exists with the above name after Executing Procedure.
Step 2:- How to DROP ALL DB_LINKS of a “PRIVATE” schema from “SYS” user
This procedure is an extended for the above procedure “Drop_DbLink”, Create a procedure named “Dropschema_dblinks”
create or replace procedure DropSchema_DbLinks(schemaName varchar2 ) is begin for link in( select l.db_link from dba_db_links l where l.owner = schemaName ) loop Drop_DbLink( schemaName => schemaName, dbLink => link.db_link ); end loop; end; / Procedure created. SQL> SQL> select owner, db_link from dba_db_links where owner ='CKPT'; OWNER DB_LINK ------------------------------ ------------------------------ CKPT DEVWEBSTORE9I_IC.CKPT.COM CKPT DEVWEBSTORE9I_IC.WORLD CKPT INTER_EDI_RO.CKPT.COM CKPT ORDERSHIPPING.CKPT.COM CKPT ORDERSHIPPING.WORLD CKPT SVC_IW.CKPT.COM 6 rows selected. SQL> exec dropschema_dblinks('CKPT'); PL/SQL procedure successfully completed. SQL> SQL> select owner, db_link from dba_db_links where owner ='CKPT'; no rows selected SQL>
Here it is all the “6” DB_LINKS dropped at one shot. 🙂
One of my favorite Collection from OTN.
Thank you for this post.
Actually I would propose one enhancement. Typically I do not add procedures to the SYS schema, but rather to another (so that it is migrated with expdp, too, and looks cleaner to me). So adding
AUTHID CURRENT_USER
and performing the procedure call as SYS will yield the result.
It an great job. i like it very much. its so helpfull