日期:2014-05-17  浏览次数:20500 次

还是触发器的问题,朋友们帮帮忙
需求:
在A表有数据插入时,同时向B也插入一条记录
所以在A表创建了个触发器(是在插入之后执行的)。可是如果触发器里在向B表插入时出现了错误,向A表插入的数据也不能成功插入了。具体代码是:


【tba 表】
USE [test]

CREATE TABLE [dbo].[tba](
[id] [int] IDENTITY(1,1) PRIMARY KEY  NOT NULL,
[title] [varchar](50) NULL,
[info] [varchar](50) NULL,
)



【tbb 表】
USE [test]

CREATE TABLE [dbo].[tbb](
[id] [int] IDENTITY(1,1) PRIMARY KEY  NOT NULL,
[title] [varchar](50) NULL,
[info] [varchar](50) NULL,
)


【err_msg 错误录入表 】
USE [test]

CREATE TABLE [dbo].[err_msg](
[id] [int] IDENTITY(1,1) PRIMARY KEY  NOT NULL,
[tb] [varchar](50) NULL,
[err] [varchar](500) NULL,
[err_time] [datetime] NULL,
)


【tba 表 的触发器】
USE [test]
GO

/****** Object:  Trigger [dbo].[tba_insert]    Script Date: 11/11/2013 10:39:25 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [dbo].[tba_insert]
   ON  [dbo].[tba] 
   AFTER INSERT
AS 
BEGIN
begin try
insert into test.dbo.tbb(id,title,info) values(1,'title','info');
                --以上语言因为ID是主键,且自动递增,所以会出错,当出错时,在tba表插入的数据就不能成功,故意出错,是想让错误记录到错误记录表
                --如果改成 insert into test.dbo.tbb(title,info) values('title','info'); 是可以正常执行的
end try
begin catch
insert into test.dbo.err_msg(tb,err,err_time) values('tba_insert_cf',error_message(),getdate())
end catch
END
GO


我现在就是想,如果触发器里出错了,要向 err_mgs表记录下错误的信息,又不影响向A表插入的数据(既使触发器有错误,不影响A表的增删改)。可是一直不能成功。
朋友们帮看看我什么地方出错了

------解决方案--------------------
试试
alter TRIGGER [dbo].[tba_insert]
   ON  [dbo].[tba] 
   AFTER INSERT
AS 
BEGIN
DECLARE @emessage NVARCHAR(max)
DECLARE @einfo NVARCHAR(max)
SET XACT_ABORT off
    begin try
        insert into dbo.tbb(id,title,info) values(1,'title','info');
                --以上语言因为ID是主键,且自动递增,所以会出错,当出错时,在tba表插入的数据就不能成功,故意出错,是想让错误记录到错误记录表
                --如果改成 insert into test.dbo.tbb(title,info) values('title','info'); 是可以正常执行的
    end TRY
    
    begin CATCH
    SELECT @emessage=error_message(),@einfo=getdat