Para resolver corretamente esse erro e conectar-se ao banco de dados Oracle apropriado, precisaremos expor um pouco sobre como o Oracle se comporta e, portanto, o que está causando esse problema em primeiro lugar.
SIDs x SERVICE_NAMES
É importante entender a (pequena) diferença entre o que a Oracle define como um
SID
comparado a um SERVICE_NAME
, pois usaremos essas informações para criar uma string de conexão adequada posteriormente. No Oracle, o identificador do sistema (ou
SID
) é um identificador local de até oito caracteres que é usado para identificar um determinado banco de dados e diferenciá-lo de outros bancos de dados no sistema. Muitas vezes, o
SID
é a palavra de prefixo ou DB_UNIQUE_NAME
que precede o DB_DOMAIN
. Por exemplo, o SID
da nossa bookstore
banco de dados, como visto no global database name
completo de bookstore.company.com
. SERVICE_NAMES
, por outro lado, representam os nomes pelos quais as instâncias de banco de dados podem ser conectadas. Um SERVICE_NAME
normalmente seguirá o formato do SID
seguido pelo domínio do banco de dados, assim:DB_UNIQUE_NAME.DB_DOMAIN
O Ouvinte TNS
Quando um cliente está tentando se conectar a um banco de dados Oracle, em vez de se conectar ao banco de dados diretamente , existe um serviço de broker que intervém e trata do pedido de conexão para o cliente.
Este aplicativo corretor é conhecido como
listener
e executa a tarefa de ouvir para solicitações de clientes recebidas. Quando uma solicitação é recebida, o listener
processa e encaminha essa solicitação para o servidor de banco de dados Oracle apropriado usando um service handler
, que apenas atua como a conexão entre o listener
e o servidor de banco de dados. Nomes e configuração TNS
Ao se conectar a um banco de dados Oracle, normalmente seu servidor de banco de dados terá
tnsnames.ora
, que é um arquivo de configuração que informa ao servidor sobre NET_SERVICE_NAMES
que são conexões de banco de dados válidas. Por padrão, este arquivo está localizado em ORACLE_HOME/network/admin
. Por exemplo, um
NET_SERVICE_NAME
descritor em tnsnames.ora
pode ser formatado assim:myDatabaseNetService =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = tcp)(HOST = localhost)(PORT = 1521)(QUEUESIZE = 100))
(CONNECT_DATA =
(SERVICE_NAME = bookstore.company.com)
)
)
Isso definiria um
NET_SERVICE_NAME
usando o SERVICE_NAME
discutimos anteriormente (bookstore.company.com
) e conectando-se a localhost
pela porta 1521
. String de conexão
Com um pouco mais de conhecimento sobre como o Oracle realmente se conecta aos bancos de dados, agora podemos ver como as
connection strings
são formatados. Conectar via Nome TNS/NET_SERVICE_NAME
Ao conectar por meio de um
NET_SERVICE_NAME
conforme especificado em seu tnsnames.ora
config, você deve usar o username
, password
e, em seguida, anexe o NET_SERVICE_NAME
com o @
símbolo, assim:username/password@NET_SERVICE_NAME
Assim, para nosso
NET_SERVICE_NAME
anterior descritor acima, o NET_SERVICE_NAME
real definimos foi myDatabaseNetService
, então nossa string de conexão pode ser algo assim:john/Hunter2@myDatabaseNetService
Conectar via SERVICE_NAME
Ao conectar por meio de um
SERVICE_NAME
, você também precisará adicionar o host
e port
, junto com o /
símbolo que precede o SERVICE_NAME
em si:username/password@host:port/SERVICE_NAME
Conectar via SID
Finalmente, se conectar sem um
NET_SERVICE_NAME
configurado ou até mesmo SERVICE_NAME
, você pode fazer isso diretamente através do SID
usando o :
símbolo em vez do /
símbolo como com o SERVICE_NAME
cadeia de conexão:username/password@host:port:SID