Para resolver correctamente este error y conectarnos a la base de datos de Oracle adecuada, necesitaremos explicar un poco cómo se comporta Oracle y, por lo tanto, qué está causando este problema en primer lugar.
SID frente a SERVICE_NAMES
Es importante comprender la (pequeña) diferencia entre lo que Oracle define como un SID
en comparación con un SERVICE_NAME
, ya que usaremos esta información para crear una cadena de conexión adecuada más adelante.
En Oracle, el identificador del sistema (o SID
) es un identificador local de hasta ocho caracteres de longitud que se utiliza para identificar una base de datos en particular y diferenciarla de otras bases de datos del sistema.
A menudo, el SID
es la palabra prefijo o DB_UNIQUE_NAME
que precede al DB_DOMAIN
. Por ejemplo, el SID
de nuestra bookstore
base de datos, como se ve en el global database name
de bookstore.company.com
.
SERVICE_NAMES
, por otro lado, representan los nombres a los que se pueden conectar las instancias de la base de datos. Un SERVICE_NAME
normalmente seguirá el formato del SID
seguido del dominio de la base de datos, así:DB_UNIQUE_NAME.DB_DOMAIN
El Oyente TNS
Cuando un cliente intenta conectarse a una base de datos de Oracle, en lugar de conectarse a la base de datos directamente , hay un servicio de intermediario que interviene y maneja la solicitud de conexión para el cliente.
Esta aplicación de intermediario se conoce como listener
y realiza la tarea de escuchar para las solicitudes de los clientes entrantes. Cuando se recibe una solicitud, el listener
procesa y reenvía esa solicitud al servidor de base de datos de Oracle adecuado mediante un service handler
, que solo actúa como la conexión entre el listener
y el servidor de la base de datos.
Nombres y configuración de TNS
Al conectarse a una base de datos Oracle, normalmente su servidor de base de datos tendrá tnsnames.ora
, que es un archivo de configuración que informa al servidor sobre NET_SERVICE_NAMES
que son conexiones de base de datos válidas. De forma predeterminada, este archivo se encuentra en ORACLE_HOME/network/admin
.
Por ejemplo, un NET_SERVICE_NAME
descriptor en tnsnames.ora
puede tener este formato:
myDatabaseNetService =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = tcp)(HOST = localhost)(PORT = 1521)(QUEUESIZE = 100))
(CONNECT_DATA =
(SERVICE_NAME = bookstore.company.com)
)
)
Esto definiría un NET_SERVICE_NAME
usando el SERVICE_NAME
discutimos anteriormente (bookstore.company.com
) y conectándose a localhost
a través del puerto 1521
.
Cadena de conexión
Con un poco más de conocimiento sobre cómo Oracle realmente se conecta a las bases de datos, ahora podemos ver cómo connection strings
tienen formato.
Conectar vía TNS Nombre/NET_SERVICE_NAME
Al conectarse a través de un NET_SERVICE_NAME
como se especifica en su tnsnames.ora
archivo de configuración, debe usar el username
, password
y luego agregue el NET_SERVICE_NAME
con el @
símbolo, así:
username/password@NET_SERVICE_NAME
Por lo tanto, para nuestro anterior NET_SERVICE_NAME
descriptor anterior, el NET_SERVICE_NAME
real definimos fue myDatabaseNetService
, por lo que nuestra cadena de conexión podría verse así:
john/Hunter2@myDatabaseNetService
Conectar vía SERVICIO_NOMBRE
Al conectarse a través de un SERVICE_NAME
, también deberá agregar el host
y port
, junto con el /
símbolo que precede a SERVICE_NAME
mismo:
username/password@host:port/SERVICE_NAME
Conectar vía SID
Finalmente, si se conecta sin un NET_SERVICE_NAME
configurado o incluso SERVICE_NAME
, puedes hacerlo directamente a través del SID
usando el :
símbolo en lugar del /
símbolo como con el SERVICE_NAME
cadena de conexión:
username/password@host:port:SID