Configurare e risolvere i problemi di un server collegato a un database Oracle in SQL Server

Questo articolo descrive come configurare un server collegato da un computer che esegue Microsoft SQL Server a un database Oracle e fornisce i passaggi di base per la risoluzione degli errori comuni che possono verificarsi quando si configura un server collegato a un database Oracle.

Versione originale del prodotto: Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 edizione Enterprise, Microsoft SQL Server 2005 Express Edition, Microsoft SQL Server Workgroup Edition 2005
Numero KB originale: 280106

Riepilogo

Questo articolo descrive come configurare un server collegato da un computer che esegue Microsoft SQL Server a un database Oracle e fornisce i passaggi di risoluzione dei problemi di base per gli errori comuni che possono verificarsi quando si configura un server collegato in Oracle. La maggior parte delle informazioni contenute in questo articolo è applicabile agli ambienti configurati per l'uso del provider Microsoft OLEDB per Oracle (MSDAORA). Evitare di usare questa funzionalità nel nuovo lavoro di sviluppo e pianificare la modifica delle applicazioni che attualmente usano questa funzionalità. Usare invece il provider OLE DB di Oracle.

Per altre informazioni sulla configurazione di un server collegato tramite il provider OLEDB di Oracle, vedere How to get up and running with Oracle and Linked Servers (Come iniziare a usare Oracle e i server collegati).

Importante

La versione corrente di Microsoft ODBC Driver per Oracle è conforme alla specifica ODBC 2.5, mentre il provider OLE DB per Oracle è un provider di API OCI Oracle 7 nativo. Sia il driver che il provider usano SQL*Net Client (o il client Net8 per Oracle 8x) e la libreria Oracle Call Interface (OCI) e altri componenti client Oracle per connettersi ai database Oracle e recuperare i dati. I componenti client Oracle sono importanti e devono essere configurati correttamente per connettersi correttamente ai database Oracle usando sia il driver che il provider.

Da Microsoft Data Access Components (MDAC) versione 2.5 e versioni successive, sia Microsoft ODBC Driver che il provider OLE DB supportano SOLO Oracle 7 e Oracle 8i con le limitazioni seguenti:

  • I tipi di dati specifici di Oracle 8.x, ad esempio CLOB, BLOB, BFILE, NCHAR, NCLOB e NVARCHAR2, non sono supportati.

  • La funzionalità Unicode per i server Oracle 7.x e 8.x non è supportata.

  • Più istanze del client Oracle o più case Oracle non sono supportate perché si basano sulla prima occorrenza della home oracle nella variabile SYSTEM PATH.

  • La restituzione di più set di risultati da una stored procedure o da un'istruzione SQL batch non è supportata tramite ADO o OLEDB.

  • I outer join annidati non sono supportati.

  • La persistenza XML non è supportata.

  • La versione maggiore di 8i non è supportata usando questi driver.

Nota

I prodotti di terze parti citati in questo articolo sono realizzati da società indipendenti da Microsoft. Microsoft non rilascia alcuna garanzia implicita o esplicita relativa alle prestazioni o all'affidabilità di tali prodotti.

Procedura per configurare un server collegato in Oracle

  1. È necessario installare il software client Oracle nel computer che esegue SQL Server in cui è configurato il server collegato.

  2. Installare il driver desiderato nel computer che esegue SQL Server. Microsoft supporta solo provider Microsoft OLE DB per Oracle e Microsoft ODBC Driver per Oracle. Se si usa un provider di terze parti o un driver di terze parti per connettersi a Oracle, è necessario contattare il rispettivo fornitore per eventuali problemi riscontrati tramite il provider o il driver.

  3. Se si usano provider Microsoft OLE DB per Oracle e Microsoft ODBC Driver per Oracle, considerare quanto segue:

    • Sia il provider OLE DB che il driver ODBC inclusi in Microsoft Data Access Components (MDAC) richiedono SQL*Net 2.3.x o una versione successiva. È necessario installare il software client Oracle 7.3.x o una versione successiva nel computer client. Il computer client è il computer che esegue SQL Server.

    • Assicurarsi di avere MDAC 2.5 o una versione successiva installata nel computer che esegue SQL Server. Con MDAC 2.1 o con una versione precedente non è possibile connettersi ai database che usano Oracle 8. x o una versione successiva.

    • Per abilitare MDAC 2.5 o versioni successive per l'uso con il software client Oracle, è necessario modificare il Registro di sistema nel computer client che esegue SQL Server come indicato nella tabella seguente.

      Oracle
      Client               Microsoft Windows 2000 and later versions
      --------------------------------------------------------------------------
      
      7.x                  [HKEY_LOCAL_MACHINE\SOFTWARE
                           Microsoft\MSDTC\MTxOCI]
                           "OracleXaLib"="xa73.dll"
                           "OracleSqlLib"="SQLLib18.dll"
                           "OracleOciLib"="ociw32.dll"
      
      8.0                  [HKEY_LOCAL_MACHINE\SOFTWARE
                           \Microsoft\MSDTC\MTxOCI]
                           "OracleXaLib"="xa80.dll"
                           "OracleSqlLib"="sqllib80.dll"
                           "OracleOciLib"="oci.dll"
      
      8.1                  [HKEY_LOCAL_MACHINE\SOFTWARE
                           \Microsoft\MSDTC\MTxOCI]
                           "OracleXaLib"="oraclient8.dll"
                           "OracleSqlLib"="orasql8.dll"
                           "OracleOciLib"="oci.dll"
      
  4. Riavviare il computer che esegue SQL Server dopo l'installazione del software client Oracle.

  5. Nel computer che esegue SQL Server configurare un server collegato usando lo script seguente.

    -- Adding linked server (from SQL Server Books Online):
    /* sp_addlinkedserver [@server =] 'server'[, [@srvproduct =] 'product_name']
     [, [@provider =] 'provider_name']
     [, [@datasrc =] 'data_source']
     [, [@location =] 'location'] [, [@provstr =] 'provider_string'] 
     [, [@catalog =] 'catalog']
    */
    
    EXEC sp_addlinkedserver 'Ora817Link', 'Oracle', 'MSDAORA', 'oracle817'
    
    -- Adding linked server login:
    /* sp_addlinkedsrvlogin [@rmtsrvname =] 'rmtsrvname'[,[@useself =] 'useself']
     [,[@locallogin =] 'locallogin']
     [,[@rmtuser =] 'rmtuser']
     [,[@rmtpassword =] 'rmtpassword']
    */
    
    EXEC sp_addlinkedsrvlogin 'Ora817Link', 'FALSE',NULL, 'scott', 'tiger'
    
    -- Help on the linked server:
    EXEC sp_linkedservers
    EXEC sp_helpserver
    select * from sysservers
    

    Nota

    Se si usa Microsoft ODBC Driver per Oracle, è possibile usare il @datasrc parametro per specificare un nome DSN. Per una connessione senza DSN, la stringa del provider viene fornita tramite il parametro @provstr . Con provider Microsoft OLE DB per Oracle, usare l'alias del server Oracle configurato nel file TNSNames.Ora per il parametro @datasrc. Per altre informazioni, vedere l'argomento "sp_addlinkedserver" nella documentazione online di SQL Server.

Messaggi di errore comuni e come risolverli

Importante

In questa sezione, metodo o attività viene illustrata la procedura per modificare il Registro di sistema. Poiché l'errata modifica del Registro di sistema può causare seri problemi, Di conseguenza, attenersi scrupolosamente alla procedura indicata. Per una maggiore protezione, eseguire il backup del Registro di sistema prima di modificarlo. In questo modo sarà possibile ripristinare il Registro di sistema se si verifica un problema. Per altre informazioni su come eseguire il backup e il ripristino del Registro di sistema, fare clic sul numero dell'articolo della Microsoft Knowledge Base seguente: 322756 Come eseguire il backup e ripristinare il Registro di sistema in Windows

È possibile usare uno dei due metodi seguenti per recuperare informazioni estese su qualsiasi errore che si verifica quando si esegue una query distribuita.

  • Metodo 1

    Connettersi a SQL Server usando SQL Server Management Studio ed eseguire il codice seguente per attivare il flag di traccia 7300.

    DBCC Traceon(7300)
    
  • Metodo 2

    Acquisire l'evento "ERRORI OLEDB" che si trova nella categoria di eventi "Errori e avvisi" in SQL Profiler. Il formato del messaggio di errore è il seguente:

    Interfaccia::Metodo non riuscito con codice di errore esadecimale.

    È possibile cercare il codice di errore esadecimale nel file Oledberr.h incluso in MDAC Software Development Kit (SDK).You can look up hex-error code in the Oledberr.h file that is included with the MDAC Software Development Kit (SDK).

Di seguito è riportato un elenco dei messaggi di errore comuni che possono verificarsi, insieme alle informazioni su come risolvere il messaggio di errore.

Nota

Se si usa SQL Server 2005 o versioni successive, questi messaggi di errore potrebbero essere leggermente diversi. Tuttavia, gli ID errore di questi messaggi di errore sono uguali a quelli delle versioni precedenti di SQL Server. Pertanto, è possibile identificarli in base agli ID errore. Per informazioni sui problemi relativi alle prestazioni, cercare SQL Server Documentazione online per l'argomento Ottimizzazione delle query distribuite.

  • Messaggio 1

    Errore 7399: il provider OLE DB "%ls" per il server collegato "%ls" ha segnalato un errore. %ls

    Attivare il flag di traccia 7300 o usare SQL Profiler per acquisire l'evento OLEDB Errors per recuperare le informazioni sull'errore OLEDB estese.

  • Messaggio 2a

    "ORA-12154: TNS:could resolve service name"

  • Messaggio 2b

    "Il client Oracle(tm) e i componenti di rete non sono stati trovati. Questi componenti sono forniti da Oracle Corporation e fanno parte dell'installazione del software client Oracle versione 7.3.3 (o successiva) "

    Questi errori si verificano quando si verifica un problema di connettività al server Oracle. Vedere la sezione Tecniche per risolvere i problemi di connettività al server Oracle di seguito per ulteriori informazioni sulla risoluzione dei problemi.

  • Messaggio 3

    Errore 7302: Impossibile creare un'istanza del provider OLE DB 'MSDAORA' per il server collegato "%ls".

    Assicurarsi che il file MSDAORA.dll sia registrato correttamente. Il file MSDAORA.dll è il provider Microsoft OLE DB per il file Oracle. Usare RegSvr32.exe per registrare provider Microsoft OLE DB per Oracle.

    Nota

    Se si usa un provider Oracle di terze parti e il provider Oracle non può essere eseguito all'esterno di un processo di SQL Server, abilitarlo all'esecuzione in-process modificando le opzioni del provider. Per modificare le opzioni del provider, usare uno dei metodi seguenti:

    • Metodo 1 Individuare la chiave del Registro di sistema seguente. Modificare quindi il valore della voce AllowInProcess (DWORD) su 1. Questa chiave del Registro di sistema si trova sotto il nome del provider corrispondente: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Providers\ProviderName.

    • Metodo 2 Seguire questa procedura per impostare l'opzione Allow inprocess per i provider che usano SQL Server Management Studio (SSMS).

    1. Aprire SSMS e connettersi all'istanza di SQL Server.
    2. In Esplora oggetti passare aProviderdi server> collegati oggetti> server.
    3. Fare clic con il pulsante destro del mouse sul provider da configurare e scegliere Proprietà.
    4. Nella finestra Opzioni provider selezionare la casella Abilita per l'opzione Consenti inprocesso .
  • Messaggio 4

    Errore 7303: Impossibile inizializzare l'oggetto origine dati del provider OLE DB 'MSDAORA' per il server collegato "%ls". [Messaggio restituito dal provider OLE/DB: ORA-01017: nome utente/password non valido; accesso negato] Traccia degli errori OLE DB [0x80040e4d restituito il provider OLE/DB 'MSDAORA' IDBInitialize::Initialize].

    Questo messaggio di errore indica che il server collegato non dispone del mapping di accesso corretto. È possibile eseguire la sp_helplinkedsrvlogin stored procedure per impostare correttamente le informazioni di accesso. Verificare inoltre di aver specificato i parametri corretti per la configurazione del server collegato.

  • Messaggio 5

    Errore 7306: Impossibile aprire la tabella ' %ls' dal provider OLE DB 'MSDAORA' per il server collegato "%ls". La tabella specificata non esiste. [Messaggio restituito dal provider OLE/DB: La tabella non esiste.] [Messaggio restituito dal provider OLE/DB: ORA-00942: tabella o vista inesistente] Traccia degli errori OLE DB [Provider OLE/DB 'MSDAORA' IOpenRowset::OpenRowset restituito 0x80040e37: La tabella specificata non esiste.].

    Errore 7312: uso non valido dello schema e/o del catalogo per il provider OLE DB '%ls' per il server collegato "%ls". È stato fornito un nome in quattro parti, ma il provider non espone le interfacce necessarie per usare un catalogo e/o uno schema.

    Errore 7313: è stato specificato uno schema o un catalogo non valido per il provider "%ls" per il server collegato "%ls".

    Errore 7314: il provider OLE DB "%ls" per il server collegato "%ls" non contiene la tabella "%ls". La tabella non esiste o l'utente corrente non dispone delle autorizzazioni per tale tabella.

    Se vengono visualizzati questi messaggi di errore, è possibile che nello schema Oracle non sia presente una tabella oppure che non si disponga delle autorizzazioni necessarie per tale tabella. Verificare che il nome dello schema sia stato digitato usando lettere maiuscole. Il caso alfabetico della tabella e delle colonne deve essere quello specificato nelle tabelle di sistema Oracle.

    Sul lato Oracle, una tabella o una colonna creata senza virgolette doppie viene archiviata in lettere maiuscole. Se la tabella o la colonna è racchiusa tra virgolette doppie, la tabella o la colonna vengono archiviate così come sono.

    La chiamata seguente mostra se la tabella esiste nello schema Oracle. Questa chiamata mostra anche il nome esatto della tabella.

    sp_tables_ex @table_server=Ora817Link, @table_schema='your_schema_name'
    
  • Messaggio 6

    Errore 7413: impossibile connettersi al server collegato '%ls' (provider OLE DB '%ls'). Abilitare la delega o usare un account di accesso SQL Server remoto per l'utente corrente. Msg 18456, Livello 14, Stato 1, Riga 1 Accesso non riuscito per l'utente ''.

    Questo messaggio di errore indica che viene tentata una query distribuita per un account di accesso autenticato di Microsoft Windows senza un mapping esplicito dell'account di accesso. In un ambiente del sistema operativo in cui la delega di sicurezza non è supportata, gli account di accesso autenticati di Windows NT richiedono un mapping esplicito a un account di accesso remoto e a una password creati usando sp_addlinkedsrvlogin.

  • Messaggio 7

    Errore 7391: impossibile eseguire l'operazione perché il provider OLE DB 'MSDAORA' per il server collegato "%ls" non è riuscito ad avviare una transazione distribuita. Traccia degli errori OLE DB [0x8004d01b restituito il provider OLE/DB 'MSDAORA' ITransactionJoin::JoinTransaction]

    Verificare che le versioni di OCI siano registrate correttamente come descritto in precedenza in questo articolo.

    Nota

    Se le voci del Registro di sistema sono tutte corrette, viene caricato il file MtxOCI.dll. Se il file MtxOCI.dll non viene caricato, non è possibile eseguire transazioni distribuite su Oracle usando provider Microsoft OLE DB per Oracle o microsoft ODBC Driver per Oracle. Se si usa un provider di terze parti e si riceve l'errore 7391, verificare che il provider OLE DB in uso supporti le transazioni distribuite. Se il provider OLE DB supporta le transazioni distribuite, verificare che Microsoft Distributed Transaction Coordinator (MSDTC) sia in esecuzione e che l'accesso alla rete sia abilitato.

  • Messaggio 8

    Errore 7392: Impossibile avviare una transazione per il provider OLE DB 'MSDAORA' per il server collegato "%ls". Traccia degli errori OLE DB [PROVIDER OLE/DB 'MSDAORA' ITransactionLocal::StartTransaction restituito 0x8004d013: ISOLEVEL=4096].

    Il provider OLE DB ha restituito l'errore 7392 perché per questa sessione può essere attiva una sola transazione. Questo errore indica che viene tentata un'istruzione di modifica dei dati su un provider OLE DB quando la connessione si trova in una transazione esplicita o implicita e il provider OLE DB non supporta le transazioni annidate. SQL Server richiede questo supporto in modo che, in determinate condizioni di errore, possa terminare gli effetti dell'istruzione di modifica dei dati continuando con la transazione.

    Se SET XACT_ABORT è ON, SQL Server non richiede il supporto delle transazioni annidate dal provider OLE DB. SET XACT_ABORT ON Eseguire quindi prima di eseguire istruzioni di modifica dei dati su tabelle remote in una transazione implicita o esplicita. Eseguire questa operazione nel caso in cui il provider OLE DB in uso non supporti le transazioni annidate.

Tecniche per risolvere i problemi di connettività al server Oracle

Per eseguire il debug dei problemi di connettività Oracle con il driver ODBC Microsoft per Oracle o il provider Microsoft OLE DB per Oracle, seguire questa procedura:

  1. Usare l'utilità Oracle SQL Plus (un'utilità di query basata su riga di comando) per verificare che sia possibile connettersi a Oracle e recuperare i dati.

    Nota

    Se non è possibile connettersi a Oracle e recuperare i dati, l'installazione o la configurazione dei componenti client Oracle non è corretta oppure non è stato creato correttamente un alias del servizio Transparent Network Substrate (TNS) per il server Oracle quando si usa l'utilità SQL*Net Easy Configuration o Oracle Net8 Easy Configuration. Contattare l'amministratore del database Oracle (DBA) per verificare che i componenti Oracle necessari siano installati e configurati correttamente.

  2. Verificare la versione del client Oracle (versione SQL*Net) installata nel computer. Sia il driver MICROSOFT ODBC per Oracle che il provider Microsoft OLE DB per Oracle richiedono l'installazione di SQL*Net versione 2.3 o successiva nel computer client.

    È possibile che la connettività da SQL Plus (lo strumento di query client Oracle) funzioni, ma è necessario riavviare il computer affinché la connettività ODBC/OLE DB funzioni correttamente.

    Nota

    Quando si usa Oracle 8i, il file con estensione rgs è vuoto.

  3. Se il client Oracle è installato e viene visualizzato un errore che indica che i componenti client Oracle 7.3 o versioni successive devono essere installati nel computer, verificare che la variabile di ambiente PATH nel computer client contenga la cartella in cui è stato installato il client Oracle, ad esempio , Oracle_Root\Bin. Se non è possibile trovare questa cartella, aggiungere la cartella alla variabile PATH per risolvere l'errore.

  4. Verificare che il file Ociw32.dll si trova nella cartella Oracle_Root\bin . Questo file .dll non può esistere in qualsiasi altro percorso nel computer client. Assicurarsi che le DLL del componente client Oracle (ad esempio, il file Core40.dll e il file Ora*.dll) non esistano all'esterno della cartella o delle sottocartelle Oracle_Root .

  5. Verificare che nel computer sia installata una singola versione client Oracle. Non possono esistere più versioni di SQL*Net nello stesso computer client con interferenze e operazioni critiche, ad esempio ricerche TNS e alias.

  6. Microsoft consiglia di avere un'installazione locale del client Oracle e di non eseguire questa operazione eseguendo il mapping di un client Oracle remoto nel computer e quindi includendolo nel percorso del sistema per connettersi a Oracle tramite ODBC/OLE DB. Il provider e il driver vengono tuttavia testati con un client Oracle installato localmente e non in una condivisione di rete.

Vedere anche