Per risolvere correttamente questo errore e connetterci al database Oracle appropriato, dovremo spiegare un po' come si comporta Oracle e, quindi, cosa sta causando questo problema in primo luogo.
SID vs SERVICE_NAMES
È importante comprendere la (leggera) differenza tra ciò che Oracle definisce come SID rispetto a un SERVICE_NAME , poiché utilizzeremo queste informazioni per creare una stringa di connessione adeguata in seguito.
In Oracle, l'identificatore di sistema (o SID ) è un identificatore locale lungo fino a otto caratteri utilizzato per identificare un particolare database e differenziarlo da altri database nel sistema.
Spesso il SID è la parola del prefisso o DB_UNIQUE_NAME che precede il DB_DOMAIN . Ad esempio, il SID della nostra bookstore database, come si vede nel global database name completo di bookstore.company.com .
SERVICE_NAMES , d'altra parte, rappresentano i nomi con cui è possibile connettere le istanze del database. Un SERVICE_NAME in genere seguirà il formato del SID seguito dal dominio del database, in questo modo:DB_UNIQUE_NAME.DB_DOMAIN
L'ascoltatore TNS
Quando un client tenta di connettersi a un database Oracle, anziché connettersi al database direttamente , esiste un servizio broker che interviene e gestisce la richiesta di connessione per il client.
Questa applicazione broker è nota come listener e svolge il compito di ascoltare per le richieste dei clienti in arrivo. Quando viene ricevuta una richiesta, il listener elabora e inoltra la richiesta al server di database Oracle appropriato utilizzando un service handler , che funge semplicemente da collegamento tra il listener e il server del database.
Nomi e configurazione TNS
Quando ci si connette a un database Oracle, in genere il server del database avrà tnsnames.ora , che è un file di configurazione che informa il server su NET_SERVICE_NAMES che sono connessioni database valide. Per impostazione predefinita, questo file si trova in ORACLE_HOME/network/admin .
Ad esempio, un NET_SERVICE_NAME descrittore in tnsnames.ora può essere formattato in questo modo:
myDatabaseNetService =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = tcp)(HOST = localhost)(PORT = 1521)(QUEUESIZE = 100))
(CONNECT_DATA =
(SERVICE_NAME = bookstore.company.com)
)
)
Questo definirebbe un NET_SERVICE_NAME utilizzando il SERVICE_NAME abbiamo discusso in precedenza (bookstore.company.com ) e connettersi a localhost attraverso la porta 1521 .
Stringa di connessione
Con un po' più di conoscenza su come Oracle si connette effettivamente ai database, ora possiamo vedere come connection strings sono formattati.
Connetti tramite TNS Name/NET_SERVICE_NAME
Quando ci si connette tramite un NET_SERVICE_NAME come specificato nel tuo tnsnames.ora config, devi usare il username , password , quindi aggiungi il NET_SERVICE_NAME con il @ simbolo, in questo modo:
username/password@NET_SERVICE_NAME
Quindi, per il nostro precedente NET_SERVICE_NAME descrittore sopra, l'effettivo NET_SERVICE_NAME abbiamo definito myDatabaseNetService , quindi la nostra stringa di connessione potrebbe assomigliare a questa:
john/Hunter2@myDatabaseNetService
Connetti tramite SERVICE_NAME
Quando ti connetti tramite un SERVICE_NAME , dovrai anche aggiungere l'host e port , insieme a / simbolo che precede il SERVICE_NAME stesso:
username/password@host:port/SERVICE_NAME
Connetti tramite SID
Infine, se ci si connette senza un NET_SERVICE_NAME configurato o anche SERVICE_NAME , puoi farlo direttamente tramite il SID utilizzando il : simbolo al posto del / simbolo come con il SERVICE_NAME stringa di connessione:
username/password@host:port:SID