Authenticate from Linux to Windows SQL Server with pyodbc
I ended up using the pymssql library which basically is pyodbc on top of the FreeTDS driver. It worked out of the box.
Weird how I had such a hard time discovering this library..
Connecting to MS SQL Server using python on linux with 'Windows Credentials'
As pointed out in one of the comments, this answer is quite stale by now. I regularly and routinely use GSSAPI to authenticate from Linux to SQL Server 2008 R2 but mostly with the EasySoft ODBC manager and the (commercial) EasySoft ODBC SQL Server driver.
In early 2009, a colleague and I managed to connect to a SQL Server 2005 instance from Solaris 10 using GSSAPI (Kerberos credentials) using DBB::Perl over a FreeTDS build linked against a particular version of the MIT kerberos libraries. The trick was -- and this is a little bit difficult to believe but I have verified it by looking through the FreeTDS source code -- to specify a zero-length user_name. If the length of the user_name string is 0 then the FreeTDS code will attempt to use GSSAPI (if that support has been compiled in). I have not been able to do this via Python and pyodbc as I could not figure out a way of getting ODBC to pass down a zero-length user_name.
Here in the perl code .. there are multiple opportunities for breakage wrt configuration files such as .freetds.conf etc. I seem to recall that the principal had to be in uppercase but my notes seem to be in disagreement with that.
$serverprincipal = 'MSSQLSvc/foo.bar.yourdomain.com:1433@YOURDOMAIN.COM';
$dbh = DBI->connect("dbi:Sybase:server=THESERVERNAME;kerberos=$serverprincipal", '', '');
You will have to know how to use the setspn utility in order to get the SQL Server server to use the appropriate security principal name.
I do not have any knowledge of the kerberos side of things because our environment was set up by an out and out Kerberos guru and has fancy stuff like mutual trust set up between the AD domain that the SQL Server is running in and the Kerberos domain that my client was running in.
There is some code http://code.google.com/p/libsqljdbc-auth/ which does GSSAPI authentication from Linux to SQL Server but it is Java only. The author (who seems to know his stuff) also has contributed a similar patch to the jTDS project which works with more recent versions of Java that have GSSAPI built in.
So the pieces are all there, it is just a big tangled mess trying to get them all to work together. I found the pyodbc to unixODBC to FreeTDS odbc to TDS integration pretty hard to trace/debug. The perl stuff because it was a pretty thin wrapper on top to CT-Lib was much easier to get going.
Unable to connect to MS SQL Server using pyodbc on Scintific Linux 7.5
You should remove 'Trusted_Connection=yes;'
from your connection string. It is used for Windows authentication, while you are trying to connect with SQL authentication (providing user name and password).
Connecting to MS SQL Server with Windows Authentication using Python?
You can specify the connection string as one long string that uses semi-colons (;
) as the argument separator.
Working example:
import pyodbc
cnxn = pyodbc.connect(r'Driver=SQL Server;Server=.\SQLEXPRESS;Database=myDB;Trusted_Connection=yes;')
cursor = cnxn.cursor()
cursor.execute("SELECT LastName FROM myContacts")
while 1:
row = cursor.fetchone()
if not row:
break
print(row.LastName)
cnxn.close()
For connection strings with lots of parameters, the following will accomplish the same thing but in a somewhat more readable way:
conn_str = (
r'Driver=SQL Server;'
r'Server=.\SQLEXPRESS;'
r'Database=myDB;'
r'Trusted_Connection=yes;'
)
cnxn = pyodbc.connect(conn_str)
(Note that there are no commas between the individual string components.)
Related Topics
In Python, How to Convert a 'Datetime' Object to Seconds
What Does a Python Process Return Code -9 Mean
Computing Cross-Correlation Function
Sort List of Lists Ascending and Then Descending
How to Print a String at a Fixed Width
In Practice, What Are the Main Uses for the "Yield From" Syntax in Python 3.3
How to Access "Static" Class Variables Within Methods in Python
How to Save a Python Interactive Session
How to Test the Membership of Multiple Values in a List
Why Python Recursive Function Returns None
How to Specify the Function Type in My Type Hints
Popen.Communicate() Throws Oserror: "[Errno 10] No Child Processes"
How Do Rpy2, Pyrserve and Pyper Compare
Caesar Cipher Function in Python
Pandas: Rolling Mean by Time Interval
How to Write a Python Module/Package