У меня есть доступ только для чтения к SQL базе данных сервера. Я хочу использовать мою Python программу, расположенную на том же компьютере, что и серверная база данных SQL, чтобы запросить ее с помощью SELECT
. Попытка хранимой процедуры ниже также является оператором SELECT
. Я использую модуль pyodb c в Python.
Я сделал три попытки получить нужные данные из базы данных. Все три попытки почти идентичны, за исключением случаев, обозначенных ниже.
При первой попытке я создал оператор SQL, который имел общее выражение таблицы, и четыре оператора SELECT
с несколькими INNER JOIN
и LEFT OUTER JOIN
, к которым присоединяются UNION ALL
операторы. Запрос возвращает правильный результат в текстовом редакторе запросов к серверу SQL, но не из моей программы Python. В программе Python она пропускает часть запроса, полученную из части Common Table Expression. При запуске из текстового редактора запросов SQL Server он возвращает результаты с общей частью табличного выражения. Однако Python и pyodb c работают без ошибок, хотя он не возвращает ничего из части Common Table Expression, когда запрос выполняется из программы Python. После попытки 1 я решил использовать альтернативу выражениям Common Table и не пытался сделать это при попытке 2 и 3.
Моя вторая попытка - создать представление на сервере SQL непосредственно на SQL База данных сервера и это представление возвращают ту же самую информацию, которую ранее делало общее выражение таблицы (теперь я могу подставить представление в свой запрос вместо общего выражения таблицы). Когда я запускаю эту попытку, я получаю сообщение об ошибке:
pyodb c .ProgrammingError: ('42S02', ”[42S02] [Microsoft] [ODB C Драйвер 17 для SQL Сервер] [SQL Сервер] Неверное имя объекта 'dbo.VW_VIEW_NAME'. (208) (SQLExecDirectW) ").
Когда я пытаюсь запустить этот dbo.VW_VIEW_NAME
на SQL Сервере база данных, использующая New Query, возвращает искомый набор результатов, но не при попытке с Python и pyodb c. На SQL сервере я могу просматривать вид с помощью обозревателя объектов и искать в папке видов. Я могу щелкнуть правой кнопкой мыши на представлении, создать оператор выбора и выполнить его с результатами. У меня есть только одна учетная запись для доступа к базе данных, и она имеет только разрешение на чтение. Код SQL, вызывающий представление в окне запроса в SQL Сервер работает нормально. Все они используют те же SQL учетные данные для входа на сервер, что и программа python.
Поэтому SQL Сервер, по-видимому, не позволяет программе Python и модулю pyodb c получить доступ к SQL Объекты базы данных сервера.
Моя третья попытка - переместить весь запрос SQL из программы Python в SQL серверную хранимую процедуру и просто выполнить хранимую процедуру из моего * Код 1088 * (Таким образом, код SQL все выполняется в базе данных без возможности возникновения проблем из-за пределов базы данных.) Администратор базы данных предоставил мне разрешение EXECUTE для моих хранимых процедур. Я снова получаю сообщение об ошибке, аналогичное ошибке с представлением:
pyodb c .ProgrammingError: ('42000', '[42000] [Microsoft] [ODB C Драйвер 17 для SQL Сервер] [SQL Сервер] Не удалось найти хранимую процедуру 'dbo.USP_MY_STORED_PROCEDURE'. (2812) (SQLExecDirectW) ").
Код SQL, вызывающий хранимую процедуру в окне запроса в SQL Сервер работает нормально. Все они используют те же SQL учетные данные для входа на сервер, что и программа python.
То есть, входит ли pyodb c на сервер SQL и получает доступ к представлению или на SQL сервер и обращаясь к хранимой процедуре, результат тот же: он не говорит, что знает что-либо об этих объектах.
Похоже, SQL Сервер может блокировать доступ pyodb c и Python к просмотреть в одной попытке запроса, а хранимую процедуру в другой попытке запроса. Есть ли что-то, что мне нужно исправить на SQL Сервере, чтобы позволить представлению и хранимой процедуре быть доступными для внешних программ?
При попытке решить эту проблему на отдельных шагах по устранению неполадок я сделал следующее : обновленная версия python до последней обновленной версии Wing IDE до последней обновленной версии pyodb c до последней версии прочитана полностью python DB 2.0 API прочитана вся документация pyodb c прочитано много ссылок в поисковых системах
Ни одна из этих попыток не дала мне ответа.
Является ли проблема вопросом SQL Сервер блокирует доступ для просмотра объектов и объектов хранимых процедур извне? Есть ли в SQL Сервере параметр, позволяющий проходить через эти вещи, которые необходимо соответствующим образом настроить?
Вот код python, ведущий к cursor1.execute ("...") оператор
conn1 = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server}'
+';SERVER='+server1+'; UID='+username1+'; PWD='+password1+';DATABASE='+database1)
cursor1 = conn1.cursor()
print('Before cursor 1 execute sql code ' + str(datetime.datetime.now()))
cursor1.execute(r"""
Моя python версия, использующая 3.8.2
pyodb c версия использующая: 4.0.30
SQL Версия сервера SQL Server 2017
Операционная система Windows Server 2012
Спасибо за помощь в решении этой проблемы.