powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема c OPENQUERY
9 сообщений из 9, страница 1 из 1
Проблема c OPENQUERY
    #32009143
Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Из 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 НЕ ОТКАТИЛ ВЫПОЛНЯЕМЫЕ ИЗМЕНЕНИЯ !!!!!!!!!!!!!
...
Рейтинг: 0 / 0
Проблема c OPENQUERY
    #32009148
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может я ошибаюсь, но мне казалось что BEGIN DISTRIBUTED TRANSACTION действует только на вызываемые удаленные процедуры.

А OPENQUERY используется для получения данных из других источников.
...
Рейтинг: 0 / 0
Проблема c OPENQUERY
    #32009153
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если вместо 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
...
Рейтинг: 0 / 0
Проблема c OPENQUERY
    #32009157
OPENQUERY открывает свою собственную отдельную сессию. Поэтому процедура отрабатывает вне контекста твоей транзакции.
...
Рейтинг: 0 / 0
Проблема c OPENQUERY
    #32009160
Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за участие.

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?


Мудрецы, не оставьте - перепробовал много, но результат пока не очень...
...
Рейтинг: 0 / 0
Проблема c OPENQUERY
    #32009163
Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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

С нетерпением и уважением жду мудрой подсказки
...
Рейтинг: 0 / 0
Проблема c OPENQUERY
    #32009168
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Несколько советов...
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 и т.д. приведет к открытию отдельной транзакции (см. сообщение Глеба Уфимцева) - и проблема останется.
...
Рейтинг: 0 / 0
Проблема c OPENQUERY
    #32009185
Fompro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное, помогло бы Bound Connections(sp_bindsession and sp_getbindtoken). Но надо получить token после BEGIN DISTRIBUTED TRANSACTION и как-то запихнуть его в OPENQUERY. Но как?
...
Рейтинг: 0 / 0
Проблема c OPENQUERY
    #32009316
Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за участие в дискуссии.
Советы отчасти помогли: выполняются 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'.

??????????????????????????

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


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