powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите найти ошибку с вызовом exec
18 сообщений из 18, страница 1 из 1
Помогите найти ошибку с вызовом exec
    #39571833
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

Есть MSSQL 12.0.5000.0 SP2
на этом сервере настроен Linked Server "смотрящий" на MySQL

На MSSQL сервере есть ДВЕ хранимые процедуры:

SBO_SP_TransactionNotification

sp_ewUpdate_DynamicField


Из SBO_SP_TransactionNotification вызывается sp_ewUpdate_DynamicField .

В sp_ewUpdate_DynamicField вызывается хранимая процедура из MySQL:
Код: sql
1.
  exec ('call update_PrjCode(1)') at mysql



т.е. в итоге получаем такую структуру вызовов:

SBO_SP_TransactionNotification -> sp_ewUpdate_DynamicField -> exec ('call update_PrjCode(1)') at mysql

Теперь суть проблемы:

Если я из SSMS выполняю связки:

exec ('call update_PrjCode(1)') at mysql - ОК

sp_ewUpdate_DynamicField -> exec ('call update_PrjCode(1)') at mysql - ОК



ДАЛЕЕ САМОЕ ИНТЕРЕСНОЕ:


Самую длинную связку выполняет приложение (назовем его SAP):

SBO_SP_TransactionNotification -> sp_ewUpdate_DynamicField -> exec ('call update_PrjCode(1)') at mysql

Последняя ХП не выполняется. т.е. именно та, что физически лежит в прилинкованном MySQL.

Пробовал сразу после выполнения писать во временную таблицу @@Error - таблица пустая.
Пробовал try - catch блоками выловить ошибку - НИЧЕГО.

Подскажите что ещё можо посмотреть?
...
Рейтинг: 0 / 0
Помогите найти ошибку с вызовом exec
    #39571849
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULER,

Пользователи, под которыми выполняете процедуру Вы и приложение одинаковы?
Владельцы обоих процедур одинаковы или нет?
В заголовках процедур нет EXECUTE AS?
Как настроен Link Server - через керберос или в нем прописан логин/пароль к MySQL?

Ну и просто "не выполнятся" процедура тоже не может. Что видно в профайлере по этому поводу?
...
Рейтинг: 0 / 0
Помогите найти ошибку с вызовом exec
    #39571877
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128,

Пользователи, под которыми выполняете процедуру Вы и приложение одинаковы? - Да
Владельцы обоих процедур одинаковы или нет? - Одинаковы
В заголовках процедур нет EXECUTE AS? - нет
Как настроен Link Server - через керберос или в нем прописан логин/пароль к MySQL? - прописан логин и пароль.

Ну и просто "не выполнятся" процедура тоже не может. Что видно в профайлере по этому поводу?
а вот тут интересно. Смогли таки выловить ошибку, воспользовавшись немного другим функционалом (по сути той же операции)

Ошибка такая: ""
The operation could not be performed because OLE DB provider "MSDASQL" for linked server "mysql" was unable to begin a distributed transaction. (CINF)

CINF - это табоица настроек приложения.
И это ошибку выводит само приложение в статусной строке.

Очень похоже на то, что приложуха, читает настройки таблицы и согласно прочитанному вываливает алерты, один из которых я поймал.
...
Рейтинг: 0 / 0
Помогите найти ошибку с вызовом exec
    #39571880
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULER,

ну хочет dtc. Или дать или думать зачем :)
...
Рейтинг: 0 / 0
Помогите найти ошибку с вызовом exec
    #39571895
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKну хочет dtc. Или дать или думать зачем :)
У меня большие сомнения в том, что к MySQL можно малой кровью прикрутить поддержку MSDTC.
Так что предпочтительный вариант - это закрывать транзакцию перед обращением к Linked Server. Видимо, транзакция открывается еще в процедуре SBO_SP_TransactionNotification до вызова sp_ewUpdate_DynamicField. Вот там, до вызова sp_ewUpdate_DynamicField ее и следует закрывать, выкручиваясь, если необходимо, логической транзакцией в пользовательской таблице транзакций и всем соответствующим ее обвесом.
...
Рейтинг: 0 / 0
Помогите найти ошибку с вызовом exec
    #39571912
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULER,

на провайдере Allow inprocess включен?
...
Рейтинг: 0 / 0
Помогите найти ошибку с вызовом exec
    #39571922
qeiugh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У SAP, вроде обычно, set implicit_transactions on
...
Рейтинг: 0 / 0
Помогите найти ошибку с вызовом exec
    #39571926
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULER
В sp_ewUpdate_DynamicField вызывается хранимая процедура из MySQL:
Код: sql
1.
  exec ('call update_PrjCode(1)') at mysql



т.е. в итоге получаем такую структуру вызовов:

SBO_SP_TransactionNotification -> sp_ewUpdate_DynamicField -> exec ('call update_PrjCode(1)') at mysql


Подскажите что ещё можо посмотреть?
Коллега, есть крайне некошерный извращенный путь.
Внутри sp_ewUpdate_DynamicField формировать динамик SQL, подставлять нужный код mysql и выполнять через xp_CMDShell и вызов mysql клиента для отработки вызова с нужным параметром на mysql сервере.
...
Рейтинг: 0 / 0
Помогите найти ошибку с вызовом exec
    #39571927
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAP,
То есть у Вас сам вызов "call update_PrjCode(1)" выполнится mysql клиентом, который будет запущен шеллом.
...
Рейтинг: 0 / 0
Помогите найти ошибку с вызовом exec
    #39571937
qeiugh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробовать

Код: sql
1.
EXEC master.dbo.sp_serveroption @server=N'mysql', @optname=N'remote proc transaction promotion', @optvalue=N'false'
...
Рейтинг: 0 / 0
Помогите найти ошибку с вызовом exec
    #39571942
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qeiugh,

Вы поясните что это такое?
...
Рейтинг: 0 / 0
Помогите найти ошибку с вызовом exec
    #39571949
qeiugh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
https://docs.microsoft.com/ru-ru/sql/relational-databases/system-stored-procedures/sp-serveroption-transact-sql

Если этот параметр имеет значение FALSE (или OFF), локальная транзакция не станет распределенной при удаленном вызове процедуры на связанном сервере.
...
Рейтинг: 0 / 0
Помогите найти ошибку с вызовом exec
    #39571959
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qeiugh,

Так из SSMS всё же выполняется!
Проблема в приложениии. Оно что-то мутит.. или я Вас не правильно понимаю?
...
Рейтинг: 0 / 0
Помогите найти ошибку с вызовом exec
    #39571969
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULERqeiugh,

Оно что-то мутит.. или я Вас не правильно понимаю?
Так я же писал выше - оно просто открывает транзакцию. А MySQL MSDTC не поддерживает. На том все и заканчивается.
...
Рейтинг: 0 / 0
Помогите найти ошибку с вызовом exec
    #39571991
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128,

Проблема решилась внезапно: В свойствах Linked Server изменил опцию:

Enable Promotion of Distributed Transactions for RPC c TRUE на FALSE

Проверил, работает. Даже не знаю откуда ждать косяков?
...
Рейтинг: 0 / 0
Помогите найти ошибку с вызовом exec
    #39572000
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULERПроверил, работает. Даже не знаю откуда ждать косяков?
Если процедура, вызываемая на MySQL модифицирует какие-то данные в БД MySQL, то эта модификация не будет откачена при откате транзакции на стороне MS SQL. Если же процдура никаких данных не модифицирует, то ни к каким ощутимым последствиям это не приведет.
...
Рейтинг: 0 / 0
Помогите найти ошибку с вызовом exec
    #39572009
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128,

Она обновляет единственное поле в таблице на MySQL
...
Рейтинг: 0 / 0
Помогите найти ошибку с вызовом exec
    #39572044
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULERptr128,

Она обновляет единственное поле в таблице на MySQL
ну так и определяйтесь, нужна распределённая транзакция или нет
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите найти ошибку с вызовом exec
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]