Нужно вставить записи на прилинкованный сервер

Ukramax

На сервере С1 работает триггер, который должен вставлять записи на удаленный прилинкованный сервер С2. Записи вставляются не по одной. В таблице на С2 ключевое поле IDENTITY. Проблема - вставка напрямую невозможна. С1 пишет ошибку, что структура данных не соответствует таблице. Убираешь поле IDENTITY все работает нормально. Как обойти данную проблему?????????
9 ответов

Ukramax

Убираешь поле IDENTITY все работает нормально. А зачем вы пытаетесь занести значение в столбец с IDENTITY ?? Его значение и так будет сформировано без вашей помощи


Ukramax

Да не пытаюсь. Локально записи вставляются нормально, поле с IDENTITY заполняется нормально. А если запрос перенести на удаленный сервер, то получается ощибка (см. выше). Далее с таблицей на С2 работают другие задачи, в частности записи из этой таблицы линкуются к другой таблице (многие-ко-многим) - для этого и нужно поле IDENTITY. Хочется его формировать автоматически, штатными способами сиквела, а не писать дополнительную процедуру.


Ukramax

Ну и формируйте это поле штатными средствами! Структуру обоих таблиц и текст процедуры в студию.


Ukramax

то получается ощибка (см. выше). Что-то я не вижу ни оригинального сообщения об ошибке, ни текста самого запроса, ни информации о структуре таблиц, ни сведений даже о версии sql-я


Ukramax

ОК счас будет


Ukramax

С1 - MSSQL 7.0 С2 - MSSQL 2000 Триггер:
CREATE TRIGGER trg_upd_PaymentBuffer ON dbo.PaymentBuffer 
FOR UPDATE 
as
if exists(select * from inserted where PaymentStatus in<b>(1</b><b>,3</b>))
begin
	declare @paymentdate smalldatetime
	set @paymentdate=GetDate()
	SET XACT_ABORT ON
	SET REMOTE_PROC_TRANSACTIONS OFF
	begin distributed tran
		insert s84.buhgaltery.dbo.singlepaymentcharges 
			select PaymentAccountId, Accounts.AccountBill, null, null, null,PaymentPersonId, PaymentSum, null, @paymentdate, null, PaymentCode 
			from inserted 
				left join Accounts on PaymentAccountID = AccountID and PaymentPersonID = PersonID
			where PaymentPersonId = PersonId and PaymentAccountId = AccountId and PaymentStatus =<b> 1</b> and PaymentWayId =<b> 9</b> 
	if @@error ><b> 0</b> begin rollback return end
	commit
end
Структура таблицы на С1 не имеет значения Структура таблицы на С2: SingleChargeID int, IDENTITY(1,1) NOT NULL PersonalAccountID smallint PersonalAccountNum char(20) LastName int FirstName int SecondName int PersonID int ChargeSum numeric(11,2) PaymentGroupID int PaymentDate smalldatetime OrganizationID int PaymentCode int


Ukramax

insert into s84.buhgaltery.dbo.singlepaymentcharges(<Список полей без поля с IDENTITY>)
select PaymentAccountId, Accounts.AccountBill, null, null, null,PaymentPersonId, PaymentSum, null, @paymentdate, null, PaymentCode 
<i>--список полей должен соответствовать предыдущему списку
</i>			from inserted 
				left join Accounts on PaymentAccountID = AccountID and PaymentPersonID = PersonID
			where PaymentPersonId = PersonId and PaymentAccountId = AccountId and PaymentStatus =<b> 1</b> and PaymentWayId =<b> 9</b>


Ukramax

Огромное мое человеческое спасибо


Ukramax

У меня более банальный триггер. Просто синхронизация таблиц.
ALTER TRIGGER KS_Insert
ON KS
FOR INSERT, UPDATE
AS 
BEGIN
 DELETE titan_KS 
 FROM titan.elcom.dbo.KS
 INNER JOIN inserted ON titan_KS.OperationID = inserted.OperationID
 WHERE ISNULL(inserted.InvoiceID,'')<>''

 INSERT INTO titan.elcom.dbo.KS
 SELECT KS.* FROM KS INNER JOIN inserted ON KS.OperationID = inserted.OperationID
END
Табличка KS идентична на обоих серверах.Если просто написать
INSERT INTO titan.elcom.dbo.KS SELECT TOP <b>1</b> * FROM KS
То все работает, а если внутри триггера, то выводит ошибку
Server: Msg <b>7391</b>, Level <b>16</b>, State <b>1</b>, Procedure KS_Insert, Line <b>12</b>
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. ]
текст которой мне к сожалению ничего не говорит