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
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:
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: