web-dev-qa-db-fra.com

Insérez la gâchette à une erreur de serveur liée

J'ai créé un déclencheur d'insertion dans une table qui se déclenchera lorsqu'un insert/mise à jour/suppression est effectué. La gâchette est censée envoyer des informations sur la requête qui l'a déclenché, mais chaque fois qu'il tire, l'erreur ci-dessous se produit.

OLE DB provider "SQLNCLI11" for linked server "TMP-DBA-DB" returned message "The transaction manager has disabled its support for remote/network transactions.".
Msg 7391, Level 16, State 2, Procedure AuditlDealerDebitAuditTrailTEST, Line 22
The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server "TMP-DBA-DB" was unable to begin a distributed transaction.

Voici ma requête de déclenchement:

    create trigger dbo.AuditlDealerDebitAuditTrailTEST
on [dbo].[lDealerDebitAuditTrailTEST] 

after UPDATE, INSERT, DELETE
as 

declare @TableName varchar(20), @User varchar(20), @PCNo varchar(20), @server nvarchar(30), @Database varchar(30), 
        @table varchar(30),@activity varchar(20), @date datetime;

begin
         set  @TableName = 'lDealerDebitAuditTrailTEST' 

if exists(SELECT * from inserted) and exists (SELECT * from deleted)
begin
    SET @User = SYSTEM_USER;
    set @PCNo = Host_NAME();
    set @server = @@SERVERNAME;
    set @Database = DB_NAME();
    Set @table = @TableName;
    SET @activity = 'UPDATE';
    set @date = GETDATE();
      INSERT into [TMP-DBA-DB].[Josel_TestDB].[dbo].[audit](ExecutedBy,  PCNo, "Server", "Database", "Table", Activity, ExecutedOn)
         values (@User, @PCNo,  @server, @Database,  @table, @Activity, @date);
end

If exists (Select * from inserted) and not exists(Select * from deleted)
begin
    SET @Activity = 'INSERT';
    SET @User = SYSTEM_USER;
    set @PCNo = Host_NAME();
    set @server = @@SERVERNAME;
    set @Database = DB_NAME();
    Set @table = @TableName;
    set @date = GETDATE();
     INSERT into [TMP-DBA-DB].[Josel_TestDB].dbo.audit(ExecutedBy,  PCNo, "Server", "Database", "Table", Activity, ExecutedOn)
         values (@User, @PCNo,  @server, @Database,  @table, @Activity, @date);
    end
If exists(select * from deleted) and not exists(Select * from inserted)
begin 
    SET @activity = 'DELETE';
    SET @User = SYSTEM_USER;
    set @PCNo = Host_NAME();
    set @server = @@SERVERNAME;
    set @Database = DB_NAME();
    Set @table = @TableName;
    set @date = GETDATE();
     INSERT into [TMP-DBA-DB].[Josel_TestDB].dbo.audit(ExecutedBy,  PCNo, "Server", "Database", "Table", Activity, ExecutedOn)
         values (@User, @PCNo,  @server, @Database,  @table, @Activity, @date);
    end

    end
GO
2
Roxzurafa

Avez-vous essayé de configurer le Coordonnateur de transaction de distribution ?

Les transactions distribuées sont des transactions nécessitant SQL Server pour obtenir des données d'une source en dehors de l'instance de SQL Server que vous utilisez (cela implique le plus souvent l'utilisation de serveurs liés et al.

Un exemple de transaction distribuée serait par exemple:

INSERT MyTable (Col1, Col2, Col3....) 
SELECT Col1, Col2, Col3 ... FROM OPENQUERY(MyLinkedServer, 'SELECT Col1, Col2, Col3 ...
FROM RemoteTable
WHERE predicate1 = Condition1')
INNER JOIN Table2 ON Table2.ColX = Col1

pour configurer le coordinateur de transaction distribué, suivez les étapes ci-dessous:

enter image description here

enter image description here

enter image description here

Maintenant, vous cliquez sur Appliquer, il demandera de redémarrer le service et vous dites yes.

cet article vaut également la peine d'être lu:

Est-ce que j'ai besoin de DTC pour mon serveur SQL?

2