如何为oracle db链接提取ddl?

时间:2015-09-24 18:37:36

标签: oracle oracle11gr2 dblink

是否有提取所有数据库链接的ddl? 我想进入sql并通过sql重新创建它们。

我可以在下面使用,它适用于PUBLIC用户,但对于非公共用户,它不会给我数据库链接所有者。

Set long 1000
SELECT DBMS_METADATA.GET_DDL('DB_LINK',db.db_link,db.owner) from dba_db_links db;

Sample link owner and name
Owner   db_link
public  link1
public  link2
user1   link3

如果我跑到上面选择它会在下面给我,#3没有用户名。

Output from above SELECT
1. create public database link "link1" using "db_alias"
2. create public database link "link2" using "db_alias"
3. create database link "link3" using "db_alias"

我使用SYS重新创建链接,并且不希望将#3创建为SYS用户。

3 个答案:

答案 0 :(得分:1)

似乎即使作为SYS用户,您也可以为其他用户创建dblink(公共dblink除外)。
即使您运行create database link your_user.link3 using "db_alias",它的所有者也会SYS。 可能的hacks以另一个用户身份连接(如果您有凭据,可以将conn添加到SQL * Plus脚本中) 或者为需要具有带参数的create database link命令运行的dblink的用户创建过程,并从sys中调用它。

答案 1 :(得分:0)

这应该有助于链接进行"连接到"

SELECT MYCOMMAND 
FROM 
(
select trim(l.owner)||'__'||trim(l.db_link)||'__'||trim(l.username)   ||'__'||trim(l.host) , '10'
, ' connect '||trim(l.owner)||'/CCCCCCCC@'||TRIM(INSTANCE_NAME)
 AS MYCOMMAND                 
from dba_db_links l , V$INSTANCE i , dba_users u  
where l.username = u.username
and l.username is not null 
and l.username <> ' '
UNION ALL
select trim(l.owner)||'__'||trim(l.db_link)||'__'||trim(l.username)||'__'||trim(l.host) , '20'
, ' DROP DATABASE LINK  '||trim(l.db_link)||' ; ' AS MYCOMMAND
from dba_db_links l , V$INSTANCE i , dba_users u  
where l.username = u.username
and l.username is not null 
and l.username <> ' '
UNION ALL
select trim(l.owner)||'__'||trim(l.db_link)||'__'||trim(l.username)||'__'||trim(l.host) , '30'
, ' CREATE DATABASE LINK  '||trim(l.db_link)
||' CONNECT TO "'||trim(l.username)||'"'
||' IDENTIFIED BY "NNNNNNNN" '
||' USING '||trim(l.host) ||' ; 'AS MYCOMMAND
from dba_db_links l , V$INSTANCE i , dba_users u  
where l.username = u.username
and l.username is not null 
and l.username <> ' '
ORDER BY 1,2,3
)

答案 2 :(得分:0)

要从数据库链接获取ddl,请运行以下命令的输出:

设置页面999; 设置长90000;

SELECT 'SELECT dbms_metadata.get_ddl(''DB_LINK'',''' || db_link || ''',''' || owner || ''') FROM dual;' 
FROM dba_db_links 
WHERE db_link 
IN ('DB_LINK1',
    'DB_LINK2',
    'DB_LINK3');

要为其他用户创建数据库链接,请使用SYS用户执行以下DDL:

CREATE DATABASE LINK "OWNER.DBLINK_NAME"
   CONNECT TO "USER" IDENTIFIED BY "Password_user"
   USING 'ALIAS';