ODBC для SQL Server, очевидно, не поддерживает параметризацию оператора ALTER LOGIN. Вместо использования этого ...
uid = 'bubba'
old_pwd = 'NASCAR'
new_pwd = 'GRITS'
sql = "ALTER LOGIN ? WITH password ? old_password ?"
crsr.execute(sql, uid, new_pwd, old_pwd)
... вам нужно будет сделать что-то вроде этого:
uid = 'bubba'
old_pwd = 'NASCAR'
new_pwd = 'GRITS'
sql = f"ALTER LOGIN {uid} WITH PASSWORD = '{new_pwd}' OLD_PASSWORD = '{old_pwd}'"
crsr.execute(sql)
ВАЖНО - Как и в случае любого динамического SQL, он потенциально уязвим к проблемам внедрения SQL. Обязательно очистите значения login_id и пароля!
(Давние пользователи SQL Server могут вспомнить, что существует системная хранимая процедура с именем sp_password
, но документация указывает, что она устарела.)