Это единственный известный мне способ отделить исходную транзакцию от действия триггера.В этом примере исходная вставка завершается, даже если вставка аудита завершается неудачно.Протестировано на 2008R2.
Это не красиво, но не откатит транзакцию!
С надежной аутентификацией все работало нормально:
create table TestTable(
ID int identity(1,1) not null
,Info varchar(50) not null
)
GO
create table AuditTable(
AuditID int identity(1,1) not null
,TestTableID int not null
,Info varchar(10) -- The failure is the mismatch in length
)
GO
create procedure insertAudit @id int, @Info varchar(50)
as
set nocount on;
begin try
insert into AuditTable(TestTableID,Info)
values(@id,@Info);
end try
begin catch
select 0
end catch;
GO
create trigger trg_TestTable on TestTable
AFTER INSERT
as
begin
set nocount on;
declare @id int,
@info varchar(50),
@cmd varchar(500),
@rc int;
select @id=ID,@info=Info from inserted;
select @cmd = 'osql -S '+@@SERVERNAME+' -E -d '+DB_NAME()+' -Q "exec insertAudit @id='+cast(@id as varchar(20))+',@Info='''+@info+'''"';
begin try
exec @rc=sys.xp_cmdshell @cmd
select @rc;
end try
begin catch
select 0;
end catch;
end
GO
Удалите таблицу аудита ион все еще завершает исходную транзакцию.
Cheers!