2016-02-02 27 views
5

Tôi đang cố kết nối với SQL server 2000 được cài đặt trên Windows server 2003 từ Windows Server 2008 R2 sử dụng mô-đun Python 3.4pyodbc. Các máy chủ đó nằm trong các miền AD khác nhau. Windows only xác thực được bật trên máy chủ SQL và tôi không thể thay đổi điều đó.Cách sử dụng xác thực cửa sổ để kết nối với máy chủ MS SQL từ máy trạm Windows trong miền khác bằng Python

drv = '{SQL server}' 
svr = 'sql.my-domain.local' 
usr = 'my-domain.local\testuser' 
pwd = 'password' 
db = 'testdb' 
pyodbc.connect(driver=drv, server=svr, user=usr, password=pwd, database=db) 

Kết nối trên không thành công với các lỗi sau:

pyodbc.Error: ('28000', "[28000] [Microsoft][ODBC SQL Server Driver][SQLServer] 
Login failed for user 'svx-iroot.local\\sqlexecutive'. 
Reason: Not associated with a trusted SQL Server connection. (18452) (SQLDriverConnect)") 

Có một số câu hỏi, ví dụ this one, gợi ý thêm trusted_connection='yes' lập luận để pyodbc kết nối để hỗ trợ các cửa sổ xác thực nhưng trong trường hợp này nó không giúp bởi vì với tùy chọn này, các thông tin cục bộ được sử dụng và tôi cần cung cấp thông tin xác thực một cách rõ ràng vì máy trạm khởi tạo nằm trong một miền AD khác.

Tạo User DSN trong ODBC Data Source Administrator với SQL Server trình điều khiển không thành công với cùng một lỗi được đề cập ở trên.

Có cách nào để thực hiện công việc này không?

Trong khi đó tôi đã cài đặt FreeTDS driver cho Windows từ http://sourceforge.net/projects/freetdswindows/ và kết nối thử nghiệm sử dụng tsql tiện ích làm việc:

tsql -S sql.my-domain.local -U my-domain.local\testuser -P password 

Nhưng FreeTDS lái xe không có sẵn trong ODBC Data Source Administrator. Trình điều khiển FreeTDS được sử dụng theo kiểu truyền thống với unixODBC. Có thể sử dụng trình điều khiển này trong môi trường Windows với pyodbc không?

Cập nhật:

Hóa ra FreeTDS nhị phân nêu trên bao gồm unixODBC là tốt. Cấu hình của freetds.conf, odbc.iniodbcinst.ini được tạo như mô tả, ví dụ: here. Nhưng tại thời điểm này tôi không hiểu cách pyodbc được cho là biết rằng trình điều khiển tồn tại FreeTDS. Và thực sự cố gắng kết nối với tài xế FreeTDS không thành công với các lỗi sau:

pyodbc.Error: ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] 
Data source name not found and no default driver specified (0) (SQLDriverConnect)') 

Pyodbc chỉ biết về trình điều khiển có sẵn trong ODBC Data Source Administrator:

ODBC Data Source Administrator screenshot

Có 2 cách để di chuyển về phía trước. Tùy chọn đầu tiên là làm cho ODBC Data Source Administrator biết về trình điều khiển FreeTDS. Để đạt được điều đó, cần tạo một giá trị mới trong khóa đăng ký HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers với tên FreeTDS và giá trị Installed. Sau đó, một khóa mới FreeTDS được tạo trong HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI và cài đặt cho trình điều khiển FreeTDS được đặt làm giá trị chuỗi trong khóa đăng ký này.

FreeTDS registry settings

Sau khi hoàn thành thủ tục lái xe FreeTDS này trở nên có sẵn trong ODBC Data Source Administrator nhưng kết nối vẫn thất bại.Cố gắng tạo User DSN trong ODBC Data Source Administrator với FreeTDS không thành công với mã lỗi 193 do sự không tương thích của 64 bit ODBC Data Source Administrator và phiên bản 32 bit FreeTDS. Tôi không có phiên bản 64 bit của FreeTDS khả dụng. Có khả năng nó có thể được biên dịch từ nguồn.

Một tùy chọn khác là đặt pyodbc sử dụng trình quản lý trình điều khiển khác (unixODBC) thay vì ODBC Data Source Administrator. Không biết cách tiếp cận điều đó.

Trả lời

2

Tôi đã sử dụng pymssql phiên bản 2.1.3 được cài đặt với bánh xe thu được từ http://www.lfd.uci.edu/~gohlke/pythonlibs/#pymssql. Nó có FreeTDS được bao gồm và nó hoạt động ngay bên ngoài hộp:

import pymssql 
conn = pymssql.connect(
    host=r'sql.my-domain.local', 
    user=r'my-domain.local\testuser', 
    password='password', 
    database='testdb' 
) 
cursor = conn.cursor() 
cursor.execute('SELECT * FROM testtable') 
Các vấn đề liên quan