触发器不将数据放入历史记录表中

时间:2011-04-09 23:03:33

标签: sql-server sql-server-2005 triggers

我有以下触发器(以及类似表上的其他触发器),有时无法将数据放入历史表中。它应该将数据放入历史表中,就像插入/更新数据一样,并标记日期。

CREATE TRIGGER [dbo].[trig_UpdateHistoricProductCustomFields]
ON [dbo].[productCustomFields]
AFTER UPDATE,INSERT
AS 
BEGIN

IF ((UPDATE(data)))
BEGIN
SET NOCOUNT ON; 

DECLARE @date bigint
SET @date = datepart(yyyy,getdate())*10000000000+datepart(mm,getdate())*100000000+datepart(dd,getdate())*1000000+datepart(hh,getdate())*10000+datepart(mi,getdate())*100+datepart(ss,getdate())

INSERT INTO historicProductCustomFields (productId,customFieldNumber,data,effectiveDate) (SELECT productId,customFieldNumber,data,@date from inserted)

END
END

架构:

CREATE TABLE [dbo].[productCustomFields](
[id] [int] IDENTITY(1,1) NOT NULL,
[productId] [int] NOT NULL,
[customFieldNumber] [int] NOT NULL,
[data] [varchar](50) NULL,
 CONSTRAINT [PK_productCustomFields] PRIMARY KEY CLUSTERED 
(
[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[historicProductCustomFields](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[productId] [int] NOT NULL,
[customFieldNumber] [int] NOT NULL,
[data] [varchar](50) NULL,
[effectiveDate] [bigint] NOT NULL,
 CONSTRAINT [PK_historicProductCustomFields] PRIMARY KEY CLUSTERED 
(
[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON,     ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

我只在productCustomFields表上一次插入和更新一条记录。它似乎在99%的时间内工作,很难测试失败。任何人都可以了解我可能做错了什么或更好的做法来解决这种类型的触发器吗?

环境是Sql Server Express 2005.我还没有为这个特定的客户端推出sql server的服务包。

3 个答案:

答案 0 :(得分:1)

我认为解决此问题的正确方法是在插入dbo.historicProductCustomFields表时保留TRY CATCH块并将错误写入自定义错误日志表。从那里很容易跟踪它。

我还在historicalProductCustomFields表上看到了PK,但如果您在ProductCustomFields表中插入并更新给定记录,那么您是否会在historicalProductCustomFields表上获得主键冲突?

答案 1 :(得分:0)

您应该对要插入的表进行架构限定。 您应该检查以确保表上没有多个触发器,就好像只有1个触发器将触发,如果有2个触发器被定义,则它们以随机顺序运行。换句话说,2个相同类型的触发器(AFTER INSERT)然后一个会触发而另一个不触发,但你没有必要控制哪个触发。

答案 2 :(得分:0)

尝试使用此触发器。我只举几个例子尝试用这个触发器写入触发器。

创建TRIGGER [dbo]。[insert_Assets_Tran]
 ON [dbo]。[AssetMaster]
插入后,更新
作为开始的   DECLARE @isnum TINYINT;

SELECT @isnum = COUNT(*)FROM inserted;

IF(@isnum = 1)
    插入AssetTransaction
    选择[AssetId],[Brandname],[SrNo],[Modelno],[Processor],[Ram],[Hdd],[Display],[Os],[Office],[Purchasedt]       [Expirydt],[供应商],[VendorAMC],[类型名],[LOCATIONNAME],[EMPID],[CreatedBy],[CreatedOn],[ModifiedBy]       [ModifiedOn],[备注],[AssetStatus],[类别],[Oylstartdt],[Oylenddt],[配置]       [AStatus],[Tassign]

FROM inserted;
  ELSE
    RAISERROR('某些字段未提供',16,1)
      WITH SETERROR;
END