2009-06-12 2 views
5

La syntaxe typique pour la création d'un lien db est comme suit:Oracle Syntaxe pour la création d'LienBase appartenant à un autre utilisateur

create database link remote_db_link 
connect to remote_user 
identified by remote_password 
using 'remote_db' 

Mais je voudrais mon lien de DB appartenant à un autre compte après sa création. Y a-t-il un moyen de faire cela?

Ce qui suit ne fonctionne pas:

create database link anotheruser.remote_db_link 
connect to remote_user 
identified by remote_password 
using 'remote_db' 
+0

La réponse "sélectionné" indique "vous ne pouvez pas créer un lien de base de données dans le schéma d'un autre utilisateur". Ce n'est pas exactement vrai. Il y a une "syntaxe Oracle" qui peut accomplir cela. Vois ma réponse. – spencer7593

Répondre

8

Restrictions on DBLinks - Vous ne pouvez pas créer un lien de base de données dans le schéma d'un autre utilisateur, et vous ne pouvez pas bénéficier dblink avec le nom d'un schéma.

+0

:-(J'avais peur de cela, merci à tous pour votre temps – Jeff

+0

En fait, il est possible de créer un lien de base de données dans le schéma d'un autre utilisateur – spencer7593

13

Sathya est correct, en ce que la syntaxe CREATE DATABASE LINK ne permet pas de créer un lien de base de données dans un autre schéma. CEPENDANT ...

Contournement

Il EST possible de créer un lien de base de données dans le schéma d'un autre utilisateur, tant que anotheruser a CREATE DATABASE LINK privilège, et l'utilisateur que vous êtes connecté en tant a CREATE ANY PROCEDURE privilège.

Voici la solution que j'utilise:

 
    create procedure anotheruser."tmp_doit_200906121431" 
    is 
    begin 
     execute immediate ' 
     create database link remote_db_link 
     connect to remote_user 
     identified by remote_password 
     using ''remote_db'' '; 
    end; 
    /
    begin 
     anotheruser."tmp_doit_200906121431"; 
    end; 
    /
    drop procedure anotheruser."tmp_doit_200906121431" 
    /

Faisons que Déroulez. Tout d'abord, je crée une procédure dans le schéma anotherusers; cette procédure contient l'instruction CREATE DATABASE LINK que je veux exécuter.

Lorsque la procédure est exécutée, il fonctionne en tant que propriétaire de la procédure, de sorte que la déclaration CREATE DATABASE LINK est exécutée par anotheruser.

Le nom de la procédure n'est pas important, sauf que je dois m'assurer qu'il n'est pas en conflit avec un nom d'objet existant. J'utilise des lettres minuscules (en insérant le nom de la procédure entre guillemets), en utilisant "tmp" pour marquer cet objet comme "temporaire", et en utilisant le yyyymmddhh24miss actuel comme partie du nom de la procédure. (J'exécute généralement une requête de DBA_OBJECTS pour vérifier qu'un nom_objet_appariant n'existe pas.)

Pour une fonction d'administration de type «one-off», il s'agit d'une solution de contournement viable. Je préfère cela à l'autre alternative: enregistrer le mot de passe de l'autre utilisateur, changer le mot de passe, se connecter en tant qu'utilisateur et réinitialiser le mot de passe d'un autre utilisateur.)

+0

Wow, excellente solution ... Merci beaucoup! – kupa

+0

Vous êtes le patron! –

-2

En tant qu'utilisateur sys, vous pouvez afficher tous les liens db dans SYS.DBA_DB_LINKS vue. Cette vue utilise le lien $ et l'utilisateur $ table. Vous pouvez créer un nouveau lien comme d'habitude et l'afficher au lien $ table. Ensuite, changez de propriétaire (utilisez l'identifiant de l'utilisateur $). commettre. Terminé.

+0

Merci de votre réponse, mais cette question a une réponse déjà acceptée – alestanis

+0

Notez que l'approche décrite dans cette réponse n'est * pas * supportée par Oracle.Oracle met vigoureusement en garde contre l'émission de DML pour modifier le contenu des tables dans le schéma SYS, sauf sous la direction du support Oracle. – spencer7593

Questions connexes