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