SQL 2008 Обновить значение, рассчитанное по предыдущей записи - PullRequest
0 голосов
/ 25 октября 2011

Таблица похожа на следующие поля: ID, InvoiceDate, SystemEntryDate, InvoiceNo, GrossTotal, Hash.Для записи с ID = 1 хэш вычисляется со всеми полями из записи 1 с помощью функции SignByAsymKey.

Для всех других записей (ID> 2) хеш рассчитывается с помощью той же функции SignByAsymKey, со всемиполя из записи и хеш из предыдущей записи.

Например, для ID = 3 хеш рассчитывается с полями InvoiceDate, SystemEntryDate, InvoiceNo, GrossTotal, для этой записи и с хешемиз записи с ID = 2.

Как мне это сделать?Лучше использовать триггер или хранимую процедуру?

Я сделал триггер обновления следующим образом, но он дает одинаковый хэш для всех записей> 1:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[Invoice_update]
           ON  [dbo].[Invoice]
           AFTER update 
        AS 
        BEGIN
            SET NOCOUNT ON;
update dbo.Invoice 
set [hash]=
    (Case
        when
            dbo.Invoice.ID=1
        Then
            SignByAsymKey (
            AsymKey_Id ('SecureAsymmetricKeyINVOICE'),
            CONVERT([nvarchar],(select [InvoiceDate] from Invoice where [ID]=1),0)+';'+
            CONVERT([nvarchar],(select [SystemEntryDate] from Invoice where [ID]=1),0)+';'+
            CONVERT([nvarchar],(select [InvoiceNo] from Invoice where [ID]=1),0)+';'+
            CONVERT([nvarchar],(select [GrossTotal] from Invoice where [ID]=1),0)
            ,N'Portal2011!')
        else
            SignByAsymKey (
            AsymKey_Id ('SecureAsymmetricKeyINVOICE'),
            CONVERT([nvarchar],inserted.[InvoiceDate],0)+';'+
            CONVERT([nvarchar],inserted.[SystemEntryDate],0)+';'+
            CONVERT([nvarchar],inserted.[InvoiceNo],0)+';'+
            CONVERT([nvarchar],inserted.[GrossTotal],0)+';'+
            CONVERT([nvarchar],
            (select [hash] from dbo.Invoice
            where [id]=inserted.id-1),0)
            ,N'Portal2011!')
    End)
from inserted
End   

1 Ответ

0 голосов
/ 25 октября 2011

Я бы сделал это с помощью триггера, поскольку вы знаете, что он срабатывает всякий раз, когда какие-либо данные добавляются / изменяются.Труднее гарантировать, что все данные будут изменены с помощью хранимой процедуры.

...