#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 влияет на одну строку.