[SQL Сервер] Не удалось подготовить оператор (ы) - PullRequest
0 голосов
/ 17 января 2020

вот мой код

import pyodbc
username = 'abcdefg'
newPassword = 'xyz1234!'
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=abc.database.windows.net;DATABASE=master;UID=yyzzyy;PWD=abcd1234!')
cursor = cnxn.cursor()
cursor.execute("ALTER LOGIN ? WITH PASSWORD = ?", username, newPassword)

Я получаю следующую ошибку:

pyodb c .ProgrammingError: ('42000', "[42000] [Microsoft] [ODB C SQL Драйвер сервера] [SQL Сервер] Неверный синтаксис рядом с '@ P1'. (102) (SQLExecDirectW); [42000] [Microsoft] [ODB C SQL Драйвер сервера] [ SQL Server] Оператор (ы) не может быть подготовлен. (8180) ")

Я не могу использовать% s или fstring, так как это рискует SQL Инъекция. приходится обходиться маркерами (?). Пожалуйста, помогите мне исправить это.

1 Ответ

2 голосов
/ 17 января 2020

LOGIN нельзя параметризировать; для этого вам нужно будет использовать Dynami c SQL. Я бы предположил , что это сработало бы для вас, с SQL точки зрения (я не знаю достаточно о python, чтобы предположить, есть ли проблема в этом коде).

DECLARE @SQL nvarchar(MAX) = N'ALTER LOGIN ' + QUOTENAME(?) + N' WITH PASSWORD = N' + REPLACE(?,'''','''''') + N';';
EXEC sp_executesql @SQL;
...