2015-03-12

pychick: (превед)
2015-03-12 12:53 pm

хозяйке на заметку - избавляемся от распределённых транзакций

Я довольно рукожоп и академиев не заканчивал, потому многое приходится осваивать методом проб и ошибок.

Внезапно встала задача такая, есть два MSSQL сервера в различных сегментах сети, достаточно жетко разграниченных по портам. MSDTC между ними поднять в виду этой особенности нельзя. Теперь задача - вставить в таблицу на одном сервере данные из таблицы на другом.

Если делать в лоб на сервере-приёмнике что-то такого вида

INSERT INTO table1 (c1, c2) SELECT v1, v2 from SERVER2.DB2.dbo.table2 v1,v2 where v1=smth

то происходит попытка запустить распределённую транзакцию, которая ожидаемо проваливается с ошибкой "Error Code: 0x8004d00a, New transaction cannot enlist in the specified transaction coordinator", т.к. координатор на сервере-источнике не доступен.

Как же сделать так, чтобы распределённая транзакция не запускалась? Через BULK INSERT же, он не транзакционен! Ну, и одну временную таблицу. Одна инструкция распадается на три:

SELECT v1, v2 INTO #t from SERVER2.DB2.dbo.table2 v1,v2 where v1=smth -- вот он, BULK INSERT.
INSERT INTO table1 (c1, c2) SELECT * from #t
DROP TABLE #t

Не благодарите.
pychick: (бытовка)
2015-03-12 01:13 pm
Entry tags:

Озон иногда откровенно пугает своими письмами

Пришло такое.



А у меня и палочка не мыта.