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

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 Триггер:
<pre class="prettyprint linenums">CREATE TRIGGER trg_upd_PaymentBuffer ON dbo.PaymentBuffer FOR UPDATE as if exists(select * from inserted where PaymentStatus in(1,3)) 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 =1 and PaymentWayId =9 if @@error >0 begin rollback return end commit end</pre>
Структура таблицы на С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

<pre class="prettyprint linenums">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 =1 and PaymentWayId =9 </pre>


Ukramax

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


Ukramax

У меня более банальный триггер. Просто синхронизация таблиц.
<pre class="prettyprint linenums">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</pre>
Табличка KS идентична на обоих серверах.Если просто написать
<pre class="prettyprint linenums">INSERT INTO titan.elcom.dbo.KS SELECT TOP 1 * FROM KS</pre>
То все работает, а если внутри триггера, то выводит ошибку
<pre class="prettyprint linenums">Server: Msg 7391, Level 16, State 1, Procedure KS_Insert, Line 12 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. ]</pre>
текст которой мне к сожалению ничего не говорит