Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите найти ошибку с вызовом exec  [new]
MAULER
Member

Откуда:
Сообщений: 891
Здравствуйте.

Есть 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:
  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 блоками выловить ошибку - НИЧЕГО.

Подскажите что ещё можо посмотреть?
19 дек 17, 10:08    [21044623]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку с вызовом exec  [new]
ptr128
Member

Откуда: Moscow
Сообщений: 398
MAULER,

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

Ну и просто "не выполнятся" процедура тоже не может. Что видно в профайлере по этому поводу?
19 дек 17, 10:47    [21044747]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку с вызовом exec  [new]
MAULER
Member

Откуда:
Сообщений: 891
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 - это табоица настроек приложения.
И это ошибку выводит само приложение в статусной строке.

Очень похоже на то, что приложуха, читает настройки таблицы и согласно прочитанному вываливает алерты, один из которых я поймал.
19 дек 17, 11:39    [21044904]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку с вызовом exec  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
MAULER,

ну хочет dtc. Или дать или думать зачем :)
19 дек 17, 11:43    [21044926]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку с вызовом exec  [new]
ptr128
Member

Откуда: Moscow
Сообщений: 398
TaPaK
ну хочет dtc. Или дать или думать зачем :)

У меня большие сомнения в том, что к MySQL можно малой кровью прикрутить поддержку MSDTC.
Так что предпочтительный вариант - это закрывать транзакцию перед обращением к Linked Server. Видимо, транзакция открывается еще в процедуре SBO_SP_TransactionNotification до вызова sp_ewUpdate_DynamicField. Вот там, до вызова sp_ewUpdate_DynamicField ее и следует закрывать, выкручиваясь, если необходимо, логической транзакцией в пользовательской таблице транзакций и всем соответствующим ее обвесом.
19 дек 17, 11:58    [21045000]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку с вызовом exec  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
MAULER,

на провайдере Allow inprocess включен?
19 дек 17, 12:32    [21045102]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку с вызовом exec  [new]
qeiugh
Guest
У SAP, вроде обычно, set implicit_transactions on
19 дек 17, 12:43    [21045145]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку с вызовом exec  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
MAULER

В sp_ewUpdate_DynamicField вызывается хранимая процедура из MySQL:
  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 сервере.
19 дек 17, 12:47    [21045162]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку с вызовом exec  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Andy_OLAP,
То есть у Вас сам вызов "call update_PrjCode(1)" выполнится mysql клиентом, который будет запущен шеллом.
19 дек 17, 12:48    [21045167]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку с вызовом exec  [new]
qeiugh
Guest
Попробовать

EXEC master.dbo.sp_serveroption @server=N'mysql', @optname=N'remote proc transaction promotion', @optvalue=N'false'
19 дек 17, 12:54    [21045193]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку с вызовом exec  [new]
MAULER
Member

Откуда:
Сообщений: 891
qeiugh,

Вы поясните что это такое?
19 дек 17, 12:59    [21045211]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку с вызовом exec  [new]
qeiugh
Guest
https://docs.microsoft.com/ru-ru/sql/relational-databases/system-stored-procedures/sp-serveroption-transact-sql

Если этот параметр имеет значение FALSE (или OFF), локальная транзакция не станет распределенной при удаленном вызове процедуры на связанном сервере.
19 дек 17, 13:07    [21045244]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку с вызовом exec  [new]
MAULER
Member

Откуда:
Сообщений: 891
qeiugh,

Так из SSMS всё же выполняется!
Проблема в приложениии. Оно что-то мутит.. или я Вас не правильно понимаю?
19 дек 17, 13:19    [21045316]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку с вызовом exec  [new]
ptr128
Member

Откуда: Moscow
Сообщений: 398
MAULER
qeiugh,

Оно что-то мутит.. или я Вас не правильно понимаю?

Так я же писал выше - оно просто открывает транзакцию. А MySQL MSDTC не поддерживает. На том все и заканчивается.
19 дек 17, 13:34    [21045366]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку с вызовом exec  [new]
MAULER
Member

Откуда:
Сообщений: 891
ptr128,

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

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

Проверил, работает. Даже не знаю откуда ждать косяков?
19 дек 17, 14:00    [21045512]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку с вызовом exec  [new]
ptr128
Member

Откуда: Moscow
Сообщений: 398
MAULER
Проверил, работает. Даже не знаю откуда ждать косяков?

Если процедура, вызываемая на MySQL модифицирует какие-то данные в БД MySQL, то эта модификация не будет откачена при откате транзакции на стороне MS SQL. Если же процдура никаких данных не модифицирует, то ни к каким ощутимым последствиям это не приведет.
19 дек 17, 14:05    [21045551]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку с вызовом exec  [new]
MAULER
Member

Откуда:
Сообщений: 891
ptr128,

Она обновляет единственное поле в таблице на MySQL
19 дек 17, 14:13    [21045598]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку с вызовом exec  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
MAULER
ptr128,

Она обновляет единственное поле в таблице на MySQL

ну так и определяйтесь, нужна распределённая транзакция или нет
19 дек 17, 14:49    [21045761]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить