Мы внедрили возможность аудита с использованием сервисного брокера и внедрили триггеры для таблиц, которые необходимо проверять.Проблема, с которой мы сталкиваемся, заключается в том, что когда мы пытаемся обновить контролируемую таблицу из транзакции, она выдает ошибку -
Текущая транзакция не может быть зафиксирована и не может поддерживать операции записи в файл журнала.,Откат транзакции.
Однако, если мы удалим триггер из проверяемой таблицы, все будет работать абсолютно нормально.не возможно ли обновить таблицу (с триггером) внутри транзакции или мы что-то упустили в конце?
Обновление транзакции
BEGIN TRAN
update ActivationKey set OrderLineTransactionId = @orderLineTransactionId, LastUpdated = getUtcdate(), [Status] =2
where PurchaseTransactionId = @transactionid
-- Rollback the transaction if there were any errors
IF @@ERROR <> 0
ROLLBACK
ELSE
COMMIT TRAN
END TRAN
Триггер
ALTER TRIGGER [dbo].[ActivationKey_AuditTrigger]
ON [dbo].[ActivationKey]
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @auditBody XML
Declare @newData nvarchar(MAX)
DECLARE @DMLType CHAR(1)
-- after delete statement
IF NOT EXISTS (SELECT * FROM inserted)
BEGIN
SELECT @auditBody = (select * FROM deleted AS t FOR XML AUTO, ELEMENTS),
@DMLType = 'D'
END
-- after update or insert statement
ELSE
BEGIN
--after Update Statement
IF EXISTS (SELECT * FROM deleted)
begin
SELECT @auditBody = (select * FROM deleted AS t FOR XML AUTO, ELEMENTS)
SELECT @newData = (select * FROM Inserted AS t FOR XML AUTO, ELEMENTS)
SELECT @DMLType = 'U'
end
ELSE -- after insert statement
begin
SELECT @auditBody = (select * FROM inserted AS t FOR XML AUTO, ELEMENTS)
SELECT @DMLType = 'I'
end
END
-- get table name dynamicaly but
DECLARE @tableName sysname
SELECT @tableName = 'ActivationKey'
SELECT @auditBody =
'<AuditMsg>
<SourceDb>' + DB_NAME() + '</SourceDb>
<SourceTable>' + @tableName + '</SourceTable>
<UserId>' + SUSER_SNAME() + '</UserId>
<DMLType>' + @DMLType + '</DMLType>
<ChangedData>' + CAST(@auditBody AS NVARCHAR(MAX)) + '</ChangedData>
<NewData>' + isnull(@newData,'') + '</NewData>
</AuditMsg>'
-- Audit data asynchrounously
EXEC dbo.procAuditSendData @auditBody
END
Сохраненный Proc (procAuditSendData) вызывается из триггера
ALTER PROCEDURE [dbo].[procAuditSendData]
(@AuditedData XML), КАК НАЧИНАЕТСЯ ПОПРОБОВАТЬ @DlgId UNIQUEIDENTIFIER, @dlgIdExists BIT SELECT @dlgIdExists * 1 * * * 99 * 1 1
END