Sql server 触发器未将数据放入历史记录表

Sql server 触发器未将数据放入历史记录表,sql-server,sql-server-2005,triggers,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 b

我有以下触发器(以及类似表中的其他触发器),有时无法将数据放入历史表中。它应该将数据完全按照插入/更新并加盖日期戳的方式放入历史表中

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%的时间都能工作,很难测试失败。有人能解释一下我在这种类型的触发器上做了哪些错误或更好的实践吗


环境是SQLServerExpress2005。我还没有为这个特定的客户端推出sql server service pack。

我认为解决这个问题的正确方法是在插入dbo.historicProductCustomFields表时保留一个TRY-CATCH块,并将错误写入自定义errorlog表。从那里很容易找到这个


我还看到historicProductCustomFields表上有一个PK,但是如果在ProductCustomFields表中插入并更新给定的记录,那么historicProductCustomFields表上不会出现主键冲突吗?

您应该对插入的表进行模式限定。
您应该检查以确保表上没有多个触发器,如果有,则该类型的触发器将只触发1个触发器,如果定义了2个触发器,则它们以随机顺序运行。换言之,两个相同类型的触发器(插入后),一个会触发,另一个不会触发,但您不必控制要触发的触发器。

尝试使用此触发器。我给你们举个例子,试着用这个触发器写触发器

创建触发器[dbo]。[insert_Assets_Tran]
在[dbo].[AssetMaster]
插入后,更新
作为开始
声明@isnum TINYINT

从inserted中选择@isnum=COUNT(*)

如果(@isnum=1)
插入资产交易
选择[AssetId]、[Brandname]、[SrNo]、[Modelno]、[Processor]、[Ram]、[Hdd]、[Display]、[Os]、[Office]、[Purchasedt] ,[Expirydt],[Vendor],[Vendor],[Typename],[LocationName],[Empid],[CreatedBy],[CreatedOn],[ModifiedBy] ,[ModifiedOn],[Remark],[AssetStatus],[Category],[Oylstardt],[Oylenddt],[Configuration] ,[AStatus],[Tassign]

从插入
否则
RAISERROR('未提供某些字段',16,1)
带有设置错误

结束

对我来说应该有用。是否在所有
UPDATE
调用中都明确设置了
data
列?@Martin,是的,在某些情况下,productCustomFields表中的数据列中有字符串值“123”,而历史表中没有字符串值。。很难调试在另一个模式中肯定没有名为
historicProductCustomFields
的表?归档表的定义是什么?它没有唯一的索引,且
IGNORE\u DUP\u KEY
选项处于打开状态?在另一个架构中肯定没有其他表。我已经更新为包含归档表的模式。id被设置为自动递增。@Luke-看不出有什么原因不能工作。
historicProductCustomFields
标识序列中是否存在任何可能表明行已删除的间隙(尽管这些间隙也可能是由错误的事务引起的)。您知道您是否缺少
插入
更新
或两者都缺少吗?如果触发器中有错误,修改肯定也会回滚。OP的PK位于
historicProductCustomFields
中的标识列上,因此您最后一句话中的问题答案显然是“否”。谢谢,我可以在触发器中添加一个try-catch并记录如下错误:。正如马丁所说,我不会被PK违规。本,你能提供一个参考吗?我从来没有听说过这种情况发生,我认为你可以有多个触发器,甚至可以使用sp_settriggerorder控制触发顺序。