if you use tnsping.exe and sqlplus.exe, the way the sqlnet.ora and tnsnames.ora are located differs
Let’s take the following setup
C:\tmp>type dir1\sqlnet.ora
NAMES.DEFAULT_DOMAIN = (EXAMPLE.COM)
NAMES.DIRECTORY_PATH = (TNSNAMES)
C:\tmp>type dir1\tnsnames.ora
db.example.com=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=srv1.example.com)(PORT=1521))(CONNECT_DATA=(SID=db01)))
db.example.org=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=srv1.example.org)(PORT=1521))(CONNECT_DATA=(SID=db01)))
C:\tmp>type dir2\sqlnet.ora
NAMES.DEFAULT_DOMAIN = (EXAMPLE.ORG)
NAMES.DIRECTORY_PATH = (TNSNAMES)
C:\tmp>type dir2\tnsnames.ora
db.example.com=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=srv2.example.com)(PORT=1521))(CONNECT_DATA=(SID=db02)))
db.example.org=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=srv2.example.org)(PORT=1521))(CONNECT_DATA=(SID=db02)))
You set TNS_ADMIN to dir1 and your current directory is dir2.
Let’s try TNSPING.EXE first
C:\tmp>cd dir2
C:\tmp\dir2>set TNS_ADMIN=C:\tmp\dir1
C:\tmp\dir2>tnsping db
TNS Ping Utility for 64-bit Windows: Version 12.1.0.1.0 - Production on 25-NOV-2013 15:47:31
Copyright (c) 1997, 2013, Oracle. All rights reserved.
Used parameter files:
C:\tmp\dir1\sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=srv2.example.com)(PORT=1521))(CONNECT_DATA=(SID=db02)))
OK (0 msec)
TNSPING.EXE is using the sqlnet.ora in %TNS_ADMIN% directory (EXAMPLE.COM domain) and the tnsnames.ora in the current directory (db02)
Let’s try with sqlplus
C:\tmp>cd dir2
C:\tmp\dir2>set TNS_ADMIN=C:\tmp\dir1
C:\tmp\dir2>sqlplus -L system@db
SQL*Plus: Release 12.1.0.1.0 Production on Mon Nov 25 16:01:15 2013
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Enter password:
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> select * from global_name;
GLOBAL_NAME
-------------------------------------------------
DB02.EXAMPLE.ORG
SQLPLUS.EXE is using the sqlnet.ora in the current directory (EXAMPLE.ORG) and the tnsnames.ora in the current directory (db02)
This does not reproduce on Linux
Interesting. I think a key there is “This does not reproduce on Linux”. Have you explored possible interactions with the registry? Perhaps tns_admin set in registry vs. as a session environment variable? I started down that road once, but the possible permutations just got too complex. One more reason one of my favorite tag lines is “My momma always said Windows was like a box of chocolates.”
Linux also has its bunch of specialities, like a .tnsnames.ora in home directory
Pingback: specify TNSNAMES for one program | Laurent Schneider
Pingback: tnsping - what it is, what it isn't :: edstevensdbaedstevensdba
interesting observation!
Pingback: tnsping – what it is, what it isn’t | Ed Stevens, DBA