Pending operation внутри распределенной транзакции на SQL 20
От: Аноним  
Дата: 09.01.08 08:11
Оценка:
При попытке внутри распраделенной транзакции

1) создать таблицу на linked server'е,
2) заполить её данными
3) и удалить таблицу

возникает ошибка "This operation conflicts with another pending operation on this transaction. The operation failed."

Ошибка происходит при удалении таблицы, при чем только на ms sql 2005 sp2. Тот же самой код на ms sql 2000 sp4 работает без ошибок.

Пример кода:

set xact_abort on
begin tran
execute roinormalize.master.dbo.sp_executesql N'create table roinormalize.dbo.linkedtest (id int)'
GO
insert into roinormalize.roinormalize.dbo.linkedtest (id) select 1
execute roinormalize.master.dbo.sp_executesql N'drop table roinormalize.dbo.linkedtest'
commit tran

Требуется это всё чтобы добавить записи в таблицу на linked server'е с включенным identity_insert (было решено это сделать с помощью промежуточной таблицы на linked server'е).

Буду благодарен за любую помощь !
Re: Pending operation внутри распределенной транзакции на SQ
От: _d_m_  
Дата: 09.01.08 09:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ошибка происходит при удалении таблицы, при чем только на ms sql 2005 sp2. Тот же самой код на ms sql 2000 sp4 работает без ошибок.


Ну и? Намек понял?
Re[2]: Pending operation внутри распределенной транзакции на
От: AndyO  
Дата: 09.01.08 09:37
Оценка:
Здравствуйте, _d_m_, Вы писали:

___>Здравствуйте, Аноним, Вы писали:


А>>Ошибка происходит при удалении таблицы, при чем только на ms sql 2005 sp2. Тот же самой код на ms sql 2000 sp4 работает без ошибок.


___>Ну и? Намек понял?


В смысле фича оказалась багом ?

Мне нужно скопировать данные (включая identity) из таблицы-источника на одном сервере в таблицу-приемник на другом, причем сделать это внутри транзакции.

Identity_insert установить на таблицу с linked server'а напрямую нельзя, только через sp_executesql. Identity_insert устанавливается для соединения, значит данные получится вставить только через pull, но для этого нужно подключаться к таблице-источнику через linked server чего делать не хотелось бы (потому что у сервера-источника нет своего внешнего ip и поднимать только из-за этого vpn не хочется).

Неужели нет более простого способа ?
Re[3]: Pending operation внутри распределенной транзакции на
От: _d_m_  
Дата: 09.01.08 09:44
Оценка:
Здравствуйте, AndyO, Вы писали:

AO>Здравствуйте, _d_m_, Вы писали:


___>>Здравствуйте, Аноним, Вы писали:


А>>>Ошибка происходит при удалении таблицы, при чем только на ms sql 2005 sp2. Тот же самой код на ms sql 2000 sp4 работает без ошибок.


___>>Ну и? Намек понял?


AO>В смысле фича оказалась багом ?



В смысле — сервиспак 4-ый накати.
Re[4]: Pending operation внутри распределенной транзакции на
От: AndyO  
Дата: 09.01.08 09:49
Оценка:
Здравствуйте, _d_m_, Вы писали:

___>Здравствуйте, AndyO, Вы писали:


AO>>Здравствуйте, _d_m_, Вы писали:


___>>>Здравствуйте, Аноним, Вы писали:


А>>>>Ошибка происходит при удалении таблицы, при чем только на ms sql 2005 sp2. Тот же самой код на ms sql 2000 sp4 работает без ошибок.


___>>>Ну и? Намек понял?


AO>>В смысле фича оказалась багом ?



___>В смысле — сервиспак 4-ый накати.



Видимо ты осмотрелся Я написал что работает на ms sql 2000 (не 2005) sp4.
Re[5]: Pending operation внутри распределенной транзакции на
От: _d_m_  
Дата: 09.01.08 10:02
Оценка:
Здравствуйте, AndyO, Вы писали:

___>>В смысле — сервиспак 4-ый накати.


AO>Видимо ты осмотрелся Я написал что работает на ms sql 2000 (не 2005) sp4.


Ммм... Точно
Re: Pending operation внутри распределенной транзакции на SQ
От: pkarklin  
Дата: 09.01.08 10:05
Оценка:
Здравствуйте, Аноним, Вы писали:

А>При попытке внутри распраделенной транзакции



А>Буду благодарен за любую помощь !


1. Почему бы sp_executesql вызывать не в master, в самой целевой бд?
2. Почему бы не linked Server не написать хп для вставки записи?
Re[2]: Pending operation внутри распределенной транзакции на
От: AndyO  
Дата: 09.01.08 10:58
Оценка:
Здравствуйте, pkarklin, Вы писали:

P>Здравствуйте, Аноним, Вы писали:


А>>При попытке внутри распраделенной транзакции



А>>Буду благодарен за любую помощь !


P>1. Почему бы sp_executesql вызывать не в master, в самой целевой бд?

P>2. Почему бы не linked Server не написать хп для вставки записи?

Спасибо за идеи, но к сожалению эти варианты не подходят.

1. Замена master'а на целевую БД ни на что не повлияла.

2. Идея с созданием хранимой процедуры на сервере-получателе у меня тоже была и это решило бы проблему (можно даже обойтись и без хранимой процедуры, просто в sp_executesql pull'ом затащить данные), но тогда из этой процедуры пришлось бы обращаться к серверу-источнику у которого нет внешнего ip адреса, т.е. пришлось бы что-то придумывать с сетевыми настройками для обращения к серверу-источнику (как вариант подключаться по vpn). Но это как мне кажется излешнее усложнение и хотелось бы найти более простое решение.
Re[3]: Pending operation внутри распределенной транзакции на
От: pkarklin  
Дата: 09.01.08 11:03
Оценка:
Здравствуйте, AndyO, Вы писали:

AO>2. Идея с созданием хранимой процедуры на сервере-получателе у меня тоже была и это решило бы проблему (можно даже обойтись и без хранимой процедуры, просто в sp_executesql pull'ом затащить данные), но тогда из этой процедуры пришлось бы обращаться к серверу-источнику у которого нет внешнего ip адреса, т.е. пришлось бы что-то придумывать с сетевыми настройками для обращения к серверу-источнику (как вариант подключаться по vpn). Но это как мне кажется излешнее усложнение и хотелось бы найти более простое решение.


Непонятно, зачем из хп на линкованном сервере обращаться "в обратку"?! Почему нельзя всю необходимую информацию передать через параметры.
Re[4]: Pending operation внутри распределенной транзакции на
От: AndyO  
Дата: 09.01.08 11:29
Оценка:
Здравствуйте, pkarklin, Вы писали:

P>Здравствуйте, AndyO, Вы писали:


AO>>2. Идея с созданием хранимой процедуры на сервере-получателе у меня тоже была и это решило бы проблему (можно даже обойтись и без хранимой процедуры, просто в sp_executesql pull'ом затащить данные), но тогда из этой процедуры пришлось бы обращаться к серверу-источнику у которого нет внешнего ip адреса, т.е. пришлось бы что-то придумывать с сетевыми настройками для обращения к серверу-источнику (как вариант подключаться по vpn). Но это как мне кажется излешнее усложнение и хотелось бы найти более простое решение.


P>Непонятно, зачем из хп на линкованном сервере обращаться "в обратку"?! Почему нельзя всю необходимую информацию передать через параметры.


Т.е. передать таблицу с записями для вставки в таблицу-получатель как параметр хранимой процедуры ?
Насколько мне известно SQL 2000/2005 не поддерживают таблицы в качестве параметров для хранимых процедур.
Re[5]: Pending operation внутри распределенной транзакции на
От: pkarklin  
Дата: 09.01.08 11:33
Оценка:
Здравствуйте, AndyO, Вы писали:

AO>Т.е. передать таблицу с записями для вставки в таблицу-получатель как параметр хранимой процедуры ?

AO>Насколько мне известно SQL 2000/2005 не поддерживают таблицы в качестве параметров для хранимых процедур.

Напишите процедуру для вставки ОДНОЙ записи на основании переданных ей параметров. Вызов ее организуйте в курсоре на основании "таблицы с записями".
Re[6]: Pending operation внутри распределенной транзакции на
От: AndyO  
Дата: 09.01.08 11:48
Оценка:
Здравствуйте, pkarklin, Вы писали:

P>Здравствуйте, AndyO, Вы писали:


AO>>Т.е. передать таблицу с записями для вставки в таблицу-получатель как параметр хранимой процедуры ?

AO>>Насколько мне известно SQL 2000/2005 не поддерживают таблицы в качестве параметров для хранимых процедур.

P>Напишите процедуру для вставки ОДНОЙ записи на основании переданных ей параметров. Вызов ее организуйте в курсоре на основании "таблицы с записями".


Кол-во записей может быть несколько тысяч и выполнять удаленный вызов stored procedure'ы для каждой записи наверное всё-таки не лучший вариант, тем более что сервера могут находиться у разных провайдеров и соединение может быть медленным. К тому же структура таблицы для копирования заранее не известна и придется все значения объединять в строку и на другой стороне их split'ить, да и ограничение на размер параметра в 8000 байт не позволит копировать таким образом некоторые записи.
Re[7]: Pending operation внутри распределенной транзакции на
От: pkarklin  
Дата: 09.01.08 11:54
Оценка:
Здравствуйте, AndyO, Вы писали:

AO>Кол-во записей может быть несколько тысяч и выполнять удаленный вызов stored procedure'ы для каждой записи наверное всё-таки не лучший вариант, тем более что сервера могут находиться у разных провайдеров и соединение может быть медленным. К тому же структура таблицы для копирования заранее не известна и придется все значения объединять в строку и на другой стороне их split'ить, да и ограничение на размер параметра в 8000 байт не позволит копировать таким образом некоторые записи.


Если речь идет о "большом копировании" смотрите в сторону DTS.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.