Подключение к MSSql с использованием аутентификации участника Azure AAD - Service
Проблема
У меня возникли проблемы с подключением к базе данных MS SQL, размещенной на сервере Azure SQL Server.
Зависимости
- Python@3.10.0
- Django@4.2.21
- pyodbc@4.0.39
Другие подробности
В среде Azure:
- Я зарегистрировал заявку в своем
Directory - Я создал
Client credentialsдля своего приложения - Я создал
SQL Logical Serverс именемorganisationиSQL Databaseс именемuniversity - Я добавил свое приложение в качестве администратора SQL server и назначил себе роль администратора SQL server.
Reader - Я внес свой публичный IP-адрес в белый список
CREATE USER [<<application_name>>] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [<<application_name>>];
P.S. Я смог подключиться, используя те же учетные данные в VS Code, без проблем. Я запустил telnet your_server_name.database.windows.net 1433 и смог найти свой SQL server.
В среде разработки (локальной среде):
- Я запускаю свое приложение в docker
- Я использую MSAL для создания токена доступа
- Я подключился, используя следующий код:
# Connection string
CONNECTION_STRING: Final[str] = "DRIVER={{ODBC Driver 18 for SQL Server}};SERVER=tcp:{server_url},{port};DATABASE={database_name};Encrypt=yes;TrustServerCertificate=yes;"
# Create an access token for login using
# 1. Tenant ID
# 2. Application ID
# 3. Secret value
AUTHORITY_URL: Final[str] = "https://login.microsoftonline.com/{tenant_id}"
application_instance: ConfidentialClientApplication = (
ConfidentialClientApplication(
client_id= {application_id},
authority= AUTHORITY_URL,
client_credential= {secret_value},
)
)
ACCESS_TOKEN: Final[str] = application_instance.acquire_token_for_client(scopes=["https://database.windows.net/.default"])["access_token"]
TOKEN: Final[bytes] = bytes(ACCESS_TOKEN, "utf-16-le")
# Connect to Database using pyodbc
connection: pyodbc.Connection = pyodbc.connect(
CONNECTION_STRING,
attrs_before={1256: TOKEN},
timeout=30,
)
<время работы/>
Обратная связь
Traceback (most recent call last):
pyodbc.connect(
pyodbc.OperationalError: ('08001', '[08001] [Microsoft][ODBC Driver 18 for SQL Server]Client unable to establish connection because an error was encountered during handshakes before login. Common causes include the client attempting to connect to an unsupported version of SQL Server, the server being too busy to accept new connections, or a resource limitation (memory or maximum allowed connections) on the server. (26) (SQLDriverConnect)')
Я хотел бы:
- подключаюсь к моему удаленному MS Sql с помощью скрипта на Python
- извлекаю информацию из таблицы в базе данных
Ссылка - Это не работает
🧩 Краткое описание проблемы
Проблема с подключением возникла из-за того, как строка подключения была интерпретирована Python 3.10.0.
❌ Неправильная реализация
CONNECTION_STRING: Final[str] = f"DRIVER={{ODBC Driver 18 for SQL Server}};SERVER=tcp:{server_url},{port};DATABASE={database_name};Encrypt=yes;TrustServerCertificate=yes;"
✅ Правильная реализация
CONNECTION_STRING: Final[str] = (
f"DRIVER={{ODBC Driver 18 for SQL Server}};"
f"SERVER={host};"
f"DATABASE={database};"
f"Encrypt=yes;"
f"TrustServerCertificate=no;"
f"Connection Timeout={timeout};"
)
⚠️ Примечание: Не учитывайте изменения в названиях параметров (например,
server_url,port, и т.д.). Ключевая проблема заключается в том, как строится строка подключения, а не в именах переменных.