联系:手机(13429648788) QQ(107644445)
链接:http://www.xifenfei.com/2793.html
标题:通过修改基表(link$)让非public dblink变为public
作者:惜分飞©版权所有[文章允许转载,但必须以链接方式注明源地址,否则追究法律责任.]
有些朋友创建了一个非public的dblink,现在该数据库的其他用户需要去使用该dblink,在正常情况下无访问权限,需要重新建一个dblink,或者将原dblink修改为public。但是由于忘记了原dblink的目标段的密码,使得创建或者修改dblink的步骤无法进行下去。这里通过修改基表(link$),解决该问题。
创建dblink
SQL> show user ; USER
is "SYS" SQL> create
database link "xff_dblink" 2
connect to
TEST 3 identified
by "test" 4 using
'11.1.1.1:1521/mcrm' ; Database
link created. SQL> select
* from
dba_db_links where
db_link like 'XFF_DBLINK%' ; OWNER DB_LINK USERN HOST CREATED ----- ------------------------------------------- ----- ------------------ -------- SYS XFF_DBLINK.REGRESS.RDBMS.DEV.US.ORACLE.COM TEST 11.1.1.1:1521/mcrm 29-MAR-12 SQL> select
sysdate from
dual@xff_dblink; SYSDATE --------- 29-MAR-12 SQL> CONN TEST/TEST Connected. SQL> SELECT
SYSDATE FROM
DUAL@XFF_DBLINK; SELECT
SYSDATE FROM DUAL@XFF_DBLINK * ERROR at
line 1: ORA-02019:
connection description
for remote database
not found --该dblink不是public的,所以test用户无权访问 |
dblink变为public类型
SQL> CONN /
AS SYSDBA Connected. SQL> set
long 1000 SQL> select
text from
dba_views where view_name= 'DBA_DB_LINKS' ; TEXT ------------------------------------------------------------------- select
u. name , l. name , l.userid, l.host, l.ctime from
sys.link$ l, sys. user $ u where
l.owner# = u. user # --查询出dblink相关的基表有link$和user$ SQL> desc
sys.link$ Name
Null ? Type ----------------------------- -------- -------------------- OWNER#
NOT NULL
NUMBER NAME
NOT NULL
VARCHAR2(128) CTIME
NOT NULL
DATE HOST VARCHAR2(2000) USERID VARCHAR2(30) PASSWORD
VARCHAR2(30) FLAG NUMBER AUTHUSR VARCHAR2(30) AUTHPWD VARCHAR2(30) PASSWORDX RAW(128) AUTHPWDX RAW(128) SQL> select
owner# from
sys.link$ where
name like 'XFF_DBLINK%' ; OWNER# ---------- 0 --XFF_DBLINK对应的用户标识记录在link$.owner#中 SQL> SELECT
USER #, NAME
FROM USER $
WHERE name
in ( 'SYS' , 'PUBLIC' ); USER #
NAME ---------- ------------------------------ 1
PUBLIC 0 SYS --现link$.owner#值为0,表示该dblink所属用户为SYS,现在让该dblink变为public --现需要让该dblink变为public,需要做的是修改link$.owner#的值为1 SQL> UPDATE
LINK$ SET
OWNER#=1 WHERE
name like 'XFF_DBLINK%' ; 1 row updated. SQL> COMMIT ; Commit
complete. --需要刷新shared_pool SQL> ALTER
SYSTEM FLUSH SHARED_POOL; System altered. --查看dblink所属者,已经修改为public SQL> select
owner from
dba_db_links where
db_link like 'XFF_DBLINK%' ; OWNER ---------- PUBLIC --测试dblink是否成功 SQL> CONN TEST/TEST Connected. SQL> SELECT
SYSDATE FROM
DUAL@XFF_DBLINK; SYSDATE --------- 29-MAR-12 |