2008-11-21 6 views
21

Je suis capable de créer et d'exécuter un package DTS qui copie des tables à partir d'une base de données Oracle distante vers un serveur SQL local, mais qui souhaite configurer la connexion à la base de données Oracle en tant que serveur lié.Comment configurer un serveur lié à une base de données Oracle sur SQL 2000/2005?

Le package DTS utilise actuellement le fournisseur Microsoft OLE DB pour Oracle avec les propriétés suivantes:

  • Source de données: SERVER=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.1.3.42)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=acc)));uid=*UserName*;pwd=*UserPassword*;
  • Mot de passe: UserPassword
  • ID utilisateur: UserName
  • Autoriser l'enregistrement du mot de passe: true

Comment puis-je configurer un serveur lié à une base de données Oracle à l'aide de la source de données définie ci-dessus?

Répondre

36

j'ai pu configurer un serveur lié à une base de données Oracle à distance, ce qui a fini par être un processus en plusieurs étapes:

  1. Installer les pilotes ODBC Oracle sur SQL Server.
  2. Création d'une base de données système DSN vers Oracle sur SQL Server.
  3. Créez un serveur lié sur un serveur SQL à l'aide de System DSN.

Etape 1: Installez les pilotes ODBC Oracle sur le serveur

a. Téléchargez les packages Oracle Instant Client nécessaires: Basic, ODBC et SQL * Plus (facultatif)

b. Décompressez les packages dans un répertoire local sur le serveur SQL, généralement C:\Oracle. Cela devrait aboutir à un [répertoire] comme C:\Oracle\instantclient_10_2, qui sera la valeur de [répertoire] référencée dans le reste de cette réponse.

c. Créez un fichier texte nommé tnsnames.ora dans le [répertoire] client instantanée qui contient les éléments suivants:

OracleTnsName = 
(
    DESCRIPTION= 
    (
    ADDRESS = (PROTOCOL=TCP)(HOST=10.1.3.42)(PORT=1521) 
) 
    (
    CONNECT_DATA = (SERVICE_NAME=acc) 
) 
) 

Note: Actual HOST, PORT et SERVICE_NAME peuvent varier en fonction sur le serveur Oracle vous établissez une connexion. Cette information peut souvent être trouvée en utilisant les outils client réseau Oracle sous les écouteurs.

Le OracleTnsName peut être n'importe quel nom que vous souhaitez attribuer à la source de données Oracle et sera utilisé lors de la configuration du DSN système. Vous pouvez également utiliser la syntaxe ci-dessus pour définir plusieurs noms TNS dans le même fichier tnsnames.ora si vous le souhaitez.

d. Ajoutez le [répertoire] au système PATH variable d'environnement.

e.Créez une nouvelle variable d'environnement système nommée TNS_Admin qui a une valeur de [répertoire]

f. Exécutez l'utilitaire [directory]\odbc_install.exe pour installer les pilotes Oracle ODBC.

g. Il est recommandé de redémarrer le serveur SQL, mais cela n'est peut-être pas nécessaire. En outre, vous pouvez accorder des autorisations de sécurité à ce répertoire pour les identités d'utilisateur du serveur SQL et de l'agent SQL.

Etape 2: Créer un système DNS qui utilise le pilote ODBC Oracle

a. Ouvrez l'outil ODBC Data Source Administrator. [Outils d'administration -> Sources de données (ODBC)]

b. Sélectionnez l'onglet DSN système, puis sélectionnez le bouton Ajouter.

c. Dans la liste des pilotes, sélectionnez Oracle dans instantclient {version}. (par exemple, Oracle dans le client instantané 10_2), puis sélectionnez le bouton Terminer.

d. Spécifiez les éléments suivants:

  • Data Source Name: {DSN Name System}
  • Description: {laisser vide/vide}
  • TNS Service Name: devrait avoir le OracleTnsName défini dans le fichier tnsnames.ora la liste, sélectionnez comme la valeur.
  • ID utilisateur: {nom d'utilisateur Oracle}

e. Sélectionnez le bouton Tester la connexion. Vous devriez être invité à fournir le {mot de passe de l'utilisateur Oracle}. Si tout se passe bien, le test réussira.

Étape 3: Créer serveur lié dans SQL à la base de données Oracle

Ouvrez une fenêtre de requête dans SQL Server et exécutez la commande suivante:

EXEC sp_addlinkedserver 
    @server  = '{Linked Server Name}' 
    ,@srvproduct = '{System DSN Name}' 
    ,@provider  = 'MSDASQL' 
    ,@datasrc  = '{System DSN Name}' 

EXEC sp_addlinkedsrvlogin 
    @rmtsrvname = '{Linked Server Name}' 
    ,@useself  = 'False' 
    ,@locallogin = NULL 
    ,@rmtuser  = '{Oracle User Name}' 
    ,@rmtpassword = '{Oracle User Password}' 

Note: Le {Linked Server Name} peut être tout ce que vous voulez à utiliser lors de la référence au serveur Oracle, mais le {System DNS Name}doit correspondre au nom du DSN système que vous avez créé précédemment. Le {Oracle User Name} doit être le même que l'ID utilisateur utilisé par le DSN système et le {Oracle User Password} doit être le même que celui que vous avez utilisé pour tester la connexion ODBC. Voir KB 280106 pour plus d'informations sur la résolution des problèmes de serveur lié Oracle.

Interrogation Oracle lié au serveur

Vous pouvez utiliser OPENQUERY pour exécuter les requêtes directes sur le serveur Oracle lié, mais sachez que pour recordsets très grand, vous pouvez recevoir un message d'erreur ORA-01652 si vous spécifiez une ORDER BY clause dans la requête directe. Le déplacement de la clause ORDER BY de la requête directe vers l'instruction select externe a résolu ce problème pour moi.

+0

Salut, je trouve que [srvproduct] a la même valeur que [datasrc] dans l'appel à sp_addlinkedserver. Je voudrais également vous demander si installer Oracle 11g express et ODT avec ODAC 11.1 sera en mesure de tester un serveur lié à Oracle. –

+0

La question/réponse a été publiée en 2008 avant Oracle 11g. Tenter d'installer un nouveau serveur lié devrait probablement être le même mais je ne sais pas avec certitude. – Oppositional

+2

Merci pour la réponse parfaite. Cela m'a aidé à installer et à faire fonctionner mon serveur Oracle en quelques heures. Juste pour ajouter, cela semble bien fonctionner avec SQL 2012 et Oracle 11g R2. – Cashley

1

J'ai eu le même problème. J'étais au téléphone avec Microsoft pendant des heures, et ils n'avaient pas de solution. Aucun de ces paramètres "timeout de connexion" ne m'a aidé.

Pour le résoudre, j'ai créé un travail DTS qui exécute un proc qui ne met à jour l'heure que sur une ligne, dans une colonne, toutes les deux minutes. Ensuite, je configure une réplication entre SQL Server et Oracle, prévue pour répliquer ce changement de cellule unique, de SQL à Oracle, toutes les 3 minutes. Cela maintient la connexion en vie!

Questions connexes