SQL 2008更新从先前记录计算的值

时间:2011-10-25 15:56:47

标签: sql sql-server-2008 calculated-columns

表格如下字段:ID,InvoiceDate,SystemEntryDate,InvoiceNo,GrossTotal,Hash。 对于ID = 1的记录,使用SignByAsymKey函数计算记录1中所有字段的哈希值。

对于所有其他记录(ID> 2),哈希是使用相同的函数SignByAsymKey计算的,记录中的所有字段和前一记录中的哈希值。

例如,对于ID = 3,哈希是使用该记录的InvoiceDate,SystemEntryDate,InvoiceNo,GrossTotal字段以及ID = 2的记录中的Hash计算的。

我该怎么做?使用触发器或存储过程是否更好?

我做了这样的更新触发器,但它为所有记录提供了相同的哈希> 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 :(得分:0)

我会用触发器执行此操作,因为您知道只要添加/修改任何数据,它就会触发。很难保证所有数据都将通过存储过程进行修改。