Триггер не помещает данные в таблицу истории - PullRequest
4 голосов
/ 10 апреля 2011

У меня есть следующий триггер (наряду с другими в аналогичных таблицах), который иногда не может поместить данные в историческую таблицу.Он должен помещать данные в историческую таблицу точно в том виде, в каком они вставлены / обновлены и проштампованы датой.

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 для этогоконкретный клиент.

Ответы [ 3 ]

1 голос
/ 11 апреля 2011

Я думаю, что правильный способ решить эту проблему - сохранить блок TRY CATCH при вставке в таблицу dbo.historicProductCustomFields и записать ошибки в пользовательскую таблицу ошибок. Оттуда это легко отследить.

Я также вижу PK в исторической таблицеProductCustomFields, но если вы вставите и обновите заданную запись в таблице ProductCustomFields, то не получите ли вы нарушения первичного ключа в исторической таблицеProductCustomFields?

0 голосов
/ 04 ноября 2011

попробуйте использовать этот триггер. Я просто приведу пример, попытайтесь написать триггер с этим триггером.

создать TRIGGER [dbo]. [Insert_Assets_Tran]
ON [dbo]. [AssetMaster]
ПОСЛЕ ВСТАВКИ, ОБНОВЛЕНИЕ
КАК НАЧАТЬ
ОБЪЯВИТЬ @isnum TINYINT;

SELECT @isnum = COUNT (*) ОТ вставлено;

IF (@isnum = 1)
INSERT INTO AssetTransaction
выберите [AssetId], [Brandname], [SrNo], [Modelno], [Processor], [Ram], [Hdd], [Display], [Os], [Office], [Purchaseagedt] , [Expirydt], [Производитель], [VendorAMC], [Имя типа], [LocationName], [EmpId], [CreatedBy], [CreatedOn], [ModifiedBy] , [ModifiedOn], [Примечание], [AssetStatus], [Категория], [Oylstartdt], [Oylenddt], [Конфигурация] [AStatus], [Tassign]

ОТ вставлено;
ELSE
RAISERROR («некоторые поля не указаны», 16, 1)
С SETERROR;
END

0 голосов
/ 10 июня 2011

Схема должна соответствовать вашей таблице, в которую вы вставляете. Вы должны убедиться, что в таблице нет нескольких триггеров, как если бы они были, только 1 триггер для этого типа триггера сработает, и если их 2, они будут запущены в случайном порядке. Другими словами, 2 триггера одного типа (ПОСЛЕ ВСТАВКИ) затем один сработает, а другой - нет, но вам не нужно иметь контроль над тем, какой из них сработает.

...