1

T_Referral テーブルで更新が発生した場合に監査テーブルを挿入するトリガーにスクリプトがあり、列の 1 つでデータを復号化するために Decrypt 関数を使用しています。トリガーの私のコードは次のとおりです。

DECLARE @Sql_Insert nvarchar(max)
SET @Sql_Insert = ''
SET @Sql_Insert='INSERT INTO [Logg].AuditLogData(TableName, ColumnName, OldValue, OldValue_Decode, NewValue, NewValue_Decode, AuditSubCategoryID,[GuID])
select TableName, ColumnName, OldValue_Decode, case when ColumnName = ''BookingUserReferenceValue'' then utl.sfDecrypt(NewValue,0) Else NewValue end, NewValue_Decode, AuditSubCategoryID,[GuID] from #AuditLogData
where ISNULL(OldValue,'') != ISNULL([NewValue],'')'

exec utl.uspOpenOrCloseEncryptionKey 'open'
exec(@Sql_Insert )
exec utl.uspOpenOrCloseEncryptionKey 'close'

私の更新スクリプトは

Update RTS.T_Referral   
set BookingUserReferenceValue =  cast ('John Wayne' as varbinary(256))
where ReferralId = 20

John Wayneテーブルの varbinary としてレコードを更新していT_Referralます (レコードは のように見えます0x4A6F686E205761796E65)。更新トリガーが呼び出されると、そのレコードが監査テーブルに John Wayne としてロードされます。レコードが BookingUserReferenceValue に挿入されると、暗号化されます。列 BookingUserReferenceValue のデータ型は Varbinary(256) です。その列のレコードを更新しようとすると、エラーが発生します:

')' の近くで、条件が予想されるコンテキストで指定された非ブール型の式。

何が問題なのですか?ありがとう

4

3 に答える 3

5

一重引用符をエスケープする必要があります。

SET @Sql_Insert='
INSERT INTO [Logg].AuditLogData(TableName, ColumnName, OldValue, OldValue_Decode, NewValue, NewValue_Decode, AuditSubCategoryID,[GuID])
select 
    TableName, ColumnName, OldValue, OldValue_Decode, 
    case when ColumnName = ''BookingUserReferenceValue'' then utl.sfDecrypt(NewValue,0) Else NewValue end,
    NewValue_Decode, AuditSubCategoryID,[GuID] 
from #AuditLogData
where 
    ISNULL(OldValue, cast('''' as varbinary(256))) != 
    ISNULL([NewValue], cast('''' as varbinary(256)))
';
于 2012-10-14T20:34:07.493 に答える
1

IF文、WHERE節、節などで非ブール式を記述すると、HAVING構文エラーになります。コードを確認してください。

于 2013-05-24T05:42:11.130 に答える
0

SELECT リストに OldValue がないと思います。列数が一致しないというエラーが表示されなかった理由がわかりません。

于 2012-10-14T22:06:12.650 に答える