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