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
これを行うには、私は新人SQLです。コード例を投稿できますか? –
@Hugo:Web上にSQL Serverのトリガを記述するコード例はたくさんあります。どちらの部分に問題がありますか? – RedFilter
私の難しさは、前のレコードを参照してハッシュを計算することです。 –