2011-10-25 22 views
0

表这样的字段的值:ID,InvoiceDate,SystemEntryDate,InvoiceNo,GrossTotal,哈希。 对于ID = 1的记录,使用SignByAsymKey函数计算记录1中的所有字段的哈希值。SQL 2008更新从以前的记录计算

对于所有其它记录(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 

回答

0

我会触发做到这一点,因为你知道它会火每当添加任何数据/改性。很难保证所有的数据都会通过存储过程进行修改。

+0

但如何做到这一点,我在SQL新秀。你能发布一个代码示例吗? –

+0

@ Hugo:在Web上有很多针对SQL Server编写触发器的代码示例。你有哪些困难? – RedFilter

+0

我的难处是引用前面的记录来计算哈希。 –