2011-10-25 53 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

我的難處是引用前面的記錄來計算哈希。 –