Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Проблема c OPENQUERY
|
|||
|---|---|---|---|
|
#18+
Из SQL-сервера вызываю хранимую процедуру, которая изменяет данные в таблице другой базы (INFORMIX). По ходу дела пытаюсь откатить изменения - и ничего не получается . Линк выполнен на ODBC. Выручайте, мудрый народ. Вот текст скрипта: -- просто читаю старые данные из таблицы бругой базы select * from inf.tgm_info.dbm.tgm_test -- читает правильно -- организую распределенную транзакцию BEGIN DISTRIBUTED TRANSACTION declare @ddd DECIMAL(18,4) -- вызываю процедуру изменения, которая возвращает новое значение SET @ddd = (select * from OPENQUERY(inf, 'EXECUTE procedure inf_set_last_accr ( 111.98 ) ')) select @ddd -- убеждаюсь, что удаленная процедура отработала -- читаю данные из таблицы до завершения транзакции select * from OPENQUERY(inf, 'select * from dbm.tgm_test') -- убеждаюсь, что изменения легли -- откатываю транзакцию rollback TRANSACTION -- читаю то, что есть в удаленной базе select * from OPENQUERY(inf, 'select * from dbm.tgm_test') -- !!!!!!!!!!!! УБЕЖДАЮСЬ, ЧТО ROLLBACK НЕ ОТКАТИЛ ВЫПОЛНЯЕМЫЕ ИЗМЕНЕНИЯ !!!!!!!!!!!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2001, 09:55 |
|
||
|
Проблема c OPENQUERY
|
|||
|---|---|---|---|
|
#18+
может я ошибаюсь, но мне казалось что BEGIN DISTRIBUTED TRANSACTION действует только на вызываемые удаленные процедуры. А OPENQUERY используется для получения данных из других источников. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2001, 10:37 |
|
||
|
Проблема c OPENQUERY
|
|||
|---|---|---|---|
|
#18+
А если вместо SET @ddd = (select * from OPENQUERY(inf, 'EXECUTE procedure inf_set_last_accr ( 111.98 ) ')) написать SET @ddd = EXECUTE procedure inf.tgm_info.dbm.inf_set_last_accr ( 111.98 ) ? Между 2-мя базами на разных машинах у меня distributed transactions работали вполне коректно - и через выполнение удаленных процедур и если просто писать набор операторов типа begin distributed tran insert into comp1.db1.dbo.table1 update comp2.db2.dbo.table1 set ... commit ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2001, 11:15 |
|
||
|
Проблема c OPENQUERY
|
|||
|---|---|---|---|
|
#18+
OPENQUERY открывает свою собственную отдельную сессию. Поэтому процедура отрабатывает вне контекста твоей транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2001, 11:44 |
|
||
|
Проблема c OPENQUERY
|
|||
|---|---|---|---|
|
#18+
Спасибо за участие. 2 SergSuper: OPENQUERY применяю только лишь из-за того, что напрямую апдейтить удаленную таблицу типа: UPDATE inf.tgm_info.dbm.tgm_test set last_accr = 111 .... Ошибка: Could not start a transaction for OLE DB provider 'MSDASQL'. НЕ ПОЛУЧИЛОСЬ 2 GreenSunrise EXECUTE procedure inf.tgm_info.dbm.inf_set_last_accr ( 111.98 ) Ошибка: Line 1: Incorrect syntax near '111.99'. или EXEC inf.tgm_info.dbm.inf_set_last_accr ( in_last_accr = 111.99 ) Ошибка: Line 1: Incorrect syntax near 'in_last_accr'. НЕ ПРОХОДЯТ Отчасти объясняю это особенностями синтаксиса INFORMIX'a. Именно поэтому стал работать через OPENQUERY - в нем хотя-бы процедуры пошли. Есть ли у кого опыт линка к INFORMIX? Еще один вопрос - как обработать ошибку, если таковая возвращается после OPENQUERY? Мудрецы, не оставьте - перепробовал много, но результат пока не очень... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2001, 12:08 |
|
||
|
Проблема c OPENQUERY
|
|||
|---|---|---|---|
|
#18+
2 Глеб Уфимцев Спасибо. Интересно. У меня два сервера (MS SQL). На одном все идет нормально (на тестовом), на другом - уже описал. Применение OPENQUERY - вынужденный шаг. Может у меня с настройками что-то не так? Повторяю: работаю через MS OLE DB Provider for ODBC, параметры линкованного сервера: DATA Source - inf Provider string - DSN=INF;UID=dbm;PWD=x4321x Security выставлено для удаленного dbm (это - admin) Data Access, RPC, RPC out - зачекованы Источник ODBC-данных INF организован для драйвера версии 3.33.0000 2.60.TC1 С нетерпением и уважением жду мудрой подсказки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2001, 12:25 |
|
||
|
Проблема c OPENQUERY
|
|||
|---|---|---|---|
|
#18+
Несколько советов... 1. Попробуйте сначала наладить распределенные транзакции между 2-мя MSSQL серверами. Хотя бы часть проблем должна решиться. А потом один из них заменить на informix. 2. Приведенный вами update на удаленном сервере должен работать. Проверьте, запущен ли DTC - это сервис Distributed transaction coordinator. Он должен быть застартован на обоих серверах. Там еще есть кое-какие настройки, например, data access нужно установить в true, сервер должен быть подлинкован нормально и т.д. 3. Incorrect syntax - ну уж это копайтесь в хелпе по informix'у, я не в курсе, как там вызывается sp. 4. Динамический вызов типа exec(@s), sp_executesql(@s), openquery и т.д. приведет к открытию отдельной транзакции (см. сообщение Глеба Уфимцева) - и проблема останется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2001, 13:36 |
|
||
|
Проблема c OPENQUERY
|
|||
|---|---|---|---|
|
#18+
Наверное, помогло бы Bound Connections(sp_bindsession and sp_getbindtoken). Но надо получить token после BEGIN DISTRIBUTED TRANSACTION и как-то запихнуть его в OPENQUERY. Но как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2001, 17:27 |
|
||
|
Проблема c OPENQUERY
|
|||
|---|---|---|---|
|
#18+
Спасибо за участие в дискуссии. Советы отчасти помогли: выполняются SELECT, UPDATE, DELETE. Но INSERT работать не хочет ни в какую: insert into inf.tgm_info.dbm.tgm_test (tgm_varchar, tgm_integer, tgm_datetime, tgm_decimal) values( NULL, NULL, NULL, 555 ) ------------------------------------------ Server: Msg 7399, Level 16, State 1, Line 1 OLE DB provider 'MSDASQL' reported an error. The provider reported an unexpected catastrophic failure. Хранимая процедура ведет себя не лучше: BEGIN DISTRIBUTED TRANSACTION EXECUTE inf.tgm_info.dbm.inf_set_last_accr 44.98 commit -------------------- Server: Msg 7212, Level 17, State 1, Line 16 Could not execute procedure 'inf_set_last_accr' on remote server 'inf'. Да и SELECT, UPDATE, DELETE идут просто в строке. Следующий скрипт возвращает чудеса: select tgm_decimal from inf.tgm_info.dbm.tgm_test SET XACT_ABORT ON BEGIN DISTRIBUTED TRANSACTION WHILE @II <= 10 BEGIN select @II = @II + 1 update inf.tgm_info.dbm.tgm_test set tgm_decimal = @II end select tgm_decimal from inf.tgm_info.dbm.tgm_test ROLLBACK transaction select tgm_decimal from inf.tgm_info.dbm.tgm_test SET XACT_ABORT OFF ------------------------------ 58 11 11 Но ведь указан ROLLBACK !!!!???? Если убираю SET XACT_ABORT, то получаю: 58 (1 row(s) affected) Server: Msg 7392, Level 16, State 2, Line 23 Could not start a transaction for OLE DB provider 'MSDASQL'. ?????????????????????????? Мастера! Прокоментируйте по возможности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2001, 09:00 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32009160&tid=1826224]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
30ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 229ms |
| total: | 342ms |

| 0 / 0 |
