需求:
在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=getdate()
end CATCH
insert into dbo.err_msg(tb,err,err_time) values('tba_insert_cf',@emessage,@einfo)
END
GO
------解决方案--------------------
你加个判断
begin try
--在insert之前 加个判断
if not exsits.....判断下ID是否已经存在
--然后再做表插入操作
begin
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
else --id存在,那就放err_msg表
begin
insert into err_msg 啥啥的
end
end try