2011-10-25 2 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 : 웹에서 SQL Server 용 트리거를 작성하는 코드 예제가 많이 있습니다. 어느 부분에 어려움이 있습니까? – RedFilter

+0

내 어려움은 이전 레코드를 참조하여 해시를 계산하는 것입니다. –