Sql Server — Партнерский менеджер транзакций отключил поддержку удаленных / сетевых транзакций

#sql #sql-server

#sql #sql-server

Вопрос:

Я использую SQL Trigger в SQL SERVER, и когда я добавил выполнение хранимой процедуры, ошибка ff продолжает отображаться.

Ошибка: поставщик OLE DB «SQLNCLI11» для связанного сервера «NSLINK» вернул сообщение «Партнерский менеджер транзакций отключил поддержку удаленных / сетевых транзакций»..

  USE [SysConfig]
    GO
    /****** Object:  Trigger [dbo].[TestingTrigger]    Script Date: 27/08/2020 5:05:13 PM ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER TRIGGER [dbo].[TestingTrigger]
        ON [dbo].[TestingMaster]
        AFTER INSERT,UPDATE
    AS
    BEGIN
    SET NOCOUNT ON;
        Declare @vActivity varchar(50)
                ,@vProgramCode varchar(100)
    
    If exists (Select * from inserted) and not exists(Select * from deleted)
    begin
        SET @vActivity = 'INSERT';
        SELECT @vProgramCode = ProgramCode from inserted i;
        INSERT into TestingMaster1(SqncNo,[Action]) 
        VALUES(@vProgramCode,@vActivity)
    
        exec EmployeeDB.dbo.[spn_SendProgram] 'ProgramCode','',@vProgramCode,'','','Test',@vActivity,'POST'
    end
    
    if exists(SELECT * from inserted) and exists (SELECT * from deleted)
    begin
        SET @vActivity = 'UPDATE';
        SELECT @vProgramCode = ProgramCode from inserted i;
        INSERT into TestingMaster1(SqncNo,[Action]) 
        VALUES(@vProgramCode,@vActivity)
        exec EmployeeDB.dbo.[spn_SendProgram] 'ProgramCode','',@vProgramCode,'','','Test',@vActivity,'PUT'
    end
    
    END
  

Комментарии:

1. Я предполагаю, что spn_SendProgram использует связанный сервер NSLINK . Проблема, которую вы видите, заключается в том, что ваша транзакция повышена до распределенной транзакции, это означает, что вам требуется DTC (координатор распределенных транзакций), а связанный сервер должен быть настроен для разрешения удаленных транзакций. Если выполняется код в триггере, он автоматически включается в транзакцию, вызывающую триггер вставки / обновления. Все инструкции выполняются в транзакции, даже если вы ее не указали.

2. Вы страдаете от очень распространенной проблемы — запускает запуск для каждого оператора, а не для каждой строки. Ваш код предполагает, что оператор insert / update / merge влияет на одну строку.