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

Откуда:
Сообщений: 293
На двух серверах есть две процедуры. Их текст может быть не так принципиален, но я все равно в полном виде его напишу.

Одна на одном сервере делает список недопоставленного товара, а другая на другом сервере накладывает на этот список выдачу денег по этим заказам

просто запуск EXEC titan.elcom.dbo.SP_OverPays_titan на втором сервере срабатывает.... а если попытаться сделать INSERT полученного из процедуры в таблицу пишет
Server: Msg 7391, Level 16, State 1, Procedure SP_OverPays, Line 9
The operation could not be performed because the OLE DB provider 'SQLOLEDB' was unable to begin a distributed transaction.
[OLE/DB provider returned message: New transaction cannot enlist in the specified transaction coordinator. ]


К сожалению мне нужно реализовать именно на двух серверах.

Список недопоставленного товара
Alter PROCEDURE SP_OverPays_Titan
as

SELECT 
	CASE WHEN in_rows.SN LIKE 'S%' THEN 'Заказ' ELSE 'Склад' END Type,
	xSuppliers.Supplier, Manufacturers.Manufacturer,
	CAST(CONVERT(varchar(8), in_rows.SentDate, 112) as smalldatetime)SentDate, CAST(CONVERT(varchar(8), in_rows.ETA, 112) as smalldatetime) ETA,
	in_rows.ManID, xSuppliers.SupplierID, in_rows.SupplyID, in_rows.RecordID, 
	in_rows.Sn, in_rows.Articul, in_rows.Title, in_rows.Quantity, in_rows.Report, in_rows.Reported, in_rows.zCurrencyID, 
	round(r.zsumm * (1-isnull(r.zdiscount,0)) * isnull(r.zshipping,1),2) as zsummr,
	in_rows.zSumm, in_rows.Comment, ENV_Rows.InvoiceID, Suppliers.Contact, Suppliers.Phones, in_Rows.ReportData, '' as Payed
FROM In_Rows
INNER JOIN spc_rows r on in_rows.clientorderid = r.orderid and in_rows.clientrecordid = r.recordid
LEFT JOIN Manufacturers ON in_rows.ManID = Manufacturers.ManID
LEFT JOIN Suppliers ON in_rows.SupplierID = Suppliers.SupplierID
LEFT JOIN Suppliers xSuppliers ON Suppliers.ParentID = xSuppliers.SupplierID 
LEFT JOIN (SELECT OrderID, RecordID, MAX(InvoiceID) InvoiceID FROM ENV_Rows GROUP BY OrderID, RecordID) ENV_Rows
	ON in_rows.SupplyID = ENV_Rows.OrderID AND in_rows.RecordID = ENV_Rows.RecordID
WHERE Reported>0 and (abs(in_rows.Reported-in_rows.zSumm)>in_rows.zSumm * 0.05 OR in_rows.Deleted<>0)-- AND IsNull(KS.OpTypeID, 0)=128
and r.sentdate >='20040101' and r.vanish=0
Go

Выдача денег
ALTER     procedure SP_OverPays as

CREATE TABLE #XXX (Type varchar(30), Supplier varchar(100), Manufacturer varchar(100), SentDate smalldatetime, ETA smalldatetime, ManID int, SupplierID int, SupplyID varchar(20), RecordID int, Sn varchar(30), Articul varchar(50), Title varchar(200), Quantity float, Report float, Reported float, zCurrencyID varchar(10), zSummR float, zSumm float, Comment varchar(200), InvoiceID varchar(10), Contact varchar(100), Phones varchar(100), ReportData smalldatetime, Payed float)

INSERT INTO #XXX (Type, Supplier, Manufacturer, SentDate, ETA, ManID, SupplierID, SupplyID, RecordID, Sn, Articul, Title, Quantity, Report, Reported, zCurrencyID, zSummR, zSumm, Comment, InvoiceID, Contact, Phones, ReportData, Payed)
EXEC titan.elcom.dbo.SP_OverPays_titan

UPDATE #XXX
SET Payed=CASE WHEN zCurrencyID LIKE 'е%' THEN KS.SummE ELSE KS.Summ END
FROM #XXX
INNER JOIN (SELECT OrderID, RecordID, Round(Sum(-[Summ]), 2) as Summ, Round(Sum(-[Summ]*RateEUR), 2) as SummE FROM KS WHERE OpTypeID=128 GROUP BY OrderID, RecordID) as KS ON #XXX.SupplyID=KS.OrderID AND #XXX.RecordID=KS.RecordID

SELECT * FROM #XXX ORDER BY Type, Supplier, ETA, Manufacturer, SupplyID, RecordID

GO
18 ноя 04, 10:28    [1115645]     Ответить | Цитировать Сообщить модератору
 Re: Не получается наладить работу LINKED SERVER  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Поиск
18 ноя 04, 10:32    [1115670]     Ответить | Цитировать Сообщить модератору
 Re: Не получается наладить работу LINKED SERVER  [new]
ziktuw
Member

Откуда:
Сообщений: 3552
MSDTC не могут между собой договориться или просто не видят друг-друга (они общаются посредством RPC, в частности по порту 1024, а также по другим, причем с виндовой авторизацией). Если у вас WAN, то задача практически нерешаема (и надо использовать OPENROWSET/OPENQUERY вместо INSERT EXEC), если LAN, то шансы есть - достаточно добиться чтобы с каждого сервера открывались шары другого по имени и были запущены MSDTC.

_________
Свет в конце тоннеля временно потушен по техническим причинам.
Картинка с другого сайта.
18 ноя 04, 10:41    [1115713]     Ответить | Цитировать Сообщить модератору
 Re: Не получается наладить работу LINKED SERVER  [new]
puzzo
Member

Откуда:
Сообщений: 293
А может кто то может реально какой нибудь метод борьбы подсказать... потому как проблема возникает не в первый раз и каждый раз её удавалось обходить просто решая задачу координально по другому.

Я уже несколько раз задавал вопрос на тему распределенных транзакций, но до сих пор не понимаю, почему SELECT проходит, а INSERT этого SELECTа во временную табличку, где триггеров, выдает ошибку.

DTCPing выдает, что все successful, запускал со всех серверов, так что из статей, данных с старых топиках извлечь ничего не удалось.
18 ноя 04, 10:54    [1115771]     Ответить | Цитировать Сообщить модератору
 Re: Не получается наладить работу LINKED SERVER  [new]
puzzo
Member

Откуда:
Сообщений: 293
Это может быть связано просто с настройкой security ?
18 ноя 04, 10:55    [1115773]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить