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

Откуда: Екб
Сообщений: 1206
Доброго времени суток!
Ситуация такая, в базе MS SQL 2005 забираю некие данные из Оракловой БД, процесс идет в два этапа:

1 Запускаю хранимку, в output параметрах получаю session_id
2 По session_id делаю запрос к табличке и получаю свои данные.

Если я все это делаю в обычной хранимке MS SQL, то работает исправно. Пытаюсь эту хранимку запихнуть в триггер(After insert) - получаю ошибку:
"ORA-02089: COMMIT не разрешен в подчиненном сеансе"

З.Ы.
Обращаюсь к линкованному ораклу при помощи -

EXECUTE (@CMD1 ,  @sid OUTPUT) AT OrclLinkSrv


В какую сторону копать? Я так понимаю запуск этой процедуры из триггера отличается только наличием транзакции?
11 дек 14, 07:38    [16981215]     Ответить | Цитировать Сообщить модератору
 Re: данные из линкованного сервера в триггере.  [new]
aleks2
Guest
Копать в сторону медитации на тему: нафига козе баян, а мне линкованный сервер в триггере?
11 дек 14, 08:41    [16981350]     Ответить | Цитировать Сообщить модератору
 Re: данные из линкованного сервера в триггере.  [new]
Glory
Member

Откуда:
Сообщений: 104760
denis_viktorovich
В какую сторону копать?

В сторону Oracle. Он ведь генерирует ошибку
11 дек 14, 09:26    [16981506]     Ответить | Цитировать Сообщить модератору
 Re: данные из линкованного сервера в триггере.  [new]
denis_viktorovich
Member

Откуда: Екб
Сообщений: 1206
Glory,

Меня смутило, что он не генерит ее при вызове не из триггера. Насколько я понимаю это сообщение возникает при попытке вызвать коммит внутри дочерней процедуры. Т.е. как я понял при апдейте код триггера работает внутри неявной транзакции. Внутри этой транзакции происходит запуск оракловой процедуры с возвратом output параметра (ид сессии), там формирование этого ИД происходит внутри другой транзакции коммит которой и не отрабатывает.

Т.е. если я правильно понимаю заставить заработать именно такую конструкцию не представляется возможным. Из-за output параметра (возникает распределенная транзакция).

P.S. Переделал по другому уже, просто интересно разобраться.
11 дек 14, 12:27    [16982723]     Ответить | Цитировать Сообщить модератору
 Re: данные из линкованного сервера в триггере.  [new]
Glory
Member

Откуда:
Сообщений: 104760
denis_viktorovich
Меня смутило, что он не генерит ее при вызове не из триггера.

Поставите в транзакции - будет и не из триггера

denis_viktorovich
Т.е. как я понял при апдейте код триггера работает внутри неявной транзакции. Внутри этой транзакции происходит запуск оракловой процедуры с возвратом output параметра (ид сессии), там формирование этого ИД происходит внутри другой транзакции коммит которой и не отрабатывает.

Транзакция, которая распространяется на несколько серверов, называется распределенной

denis_viktorovich
Т.е. если я правильно понимаю заставить заработать именно такую конструкцию не представляется возможным. Из-за output параметра (возникает распределенная транзакция).

MSSQL не может установить Oracle-у правила, по которым в нем должны работать транзакции.
11 дек 14, 12:32    [16982765]     Ответить | Цитировать Сообщить модератору
 Re: данные из линкованного сервера в триггере.  [new]
denis_viktorovich
Member

Откуда: Екб
Сообщений: 1206
aleks2
Копать в сторону медитации на тему: нафига козе баян, а мне линкованный сервер в триггере?


Согласен, так делать не стоит, уже по другому сделал. Просто внутри Begin tran .... commit tran тоже самое, что и в триггере. Вот и интересно, есть ли решения кроме выноса из транзакции и отказа от output параметра.
11 дек 14, 12:37    [16982810]     Ответить | Цитировать Сообщить модератору
 Re: данные из линкованного сервера в триггере.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
denis_viktorovich, распределенная транзакция начинается, если результат execute куда-либо сохраняется.
Попробуйте переписать на прямой запрос вместо вызова процедуры.
11 дек 14, 13:16    [16983105]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить