2011-10-25 13 views
0

ID、InvoiceDate、SystemEntryDate、InvoiceNo、GrossTotal、Hashの各フィールドのようなテーブル。 ID = 1のレコードの場合、レコード1のすべてのフィールドとSignByAsymKey関数を使用してハッシュが計算されます。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

私の難しさは、前のレコードを参照してハッシュを計算することです。 –

関連する問題