2015-09-24 2 views
1

Есть ли способ извлечь ddl для всех ссылок на базы данных? Я хотел бы получить в sql и воссоздать их через sql.Как извлечь ddl для ссылок oracle db?

Я могу использовать ниже, и он работает для пользователя PUBLIC, но для негосударственного пользователя он не дает мне владельца ссылки db.

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.

ответ

1

Кажется, что даже как пользователь SYS вы не можете легко создать dblink для другого пользователя (кроме публичного dblink).
Даже если вы запустите create database link your_user.link3 using "db_alias", его владелец будет SYS. Возможные хаки подключаются как к другому пользователю
(вы можете добавить conn в скрипт SQL * Plus, если у вас есть учетные данные)
Или создайте процедуру для пользователя, которому необходимо иметь dblink, которые запускают команду с параметрами и вызывают ее из sys.

0

это должно помочь со ссылками, которые делают «подключаются к»

SELECT MYCOMMAND 
FROM 
(
select trim(l.owner)||'__'||trim(l.db_link)||'__'||trim(l.username) ||'__'||trim(l.host) , '10' 
, ' connect '||trim(l.owner)||'/[email protected]'||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 
) 
Смежные вопросы