如果在T_Referral表上发生任何更新,并且我使用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
作为T_Referral
表中的varbinary(记录看起来像0x4A6F686E205761796E65
),当调用更新触发器时,它会将该记录作为John Wayne加载到Audit表中。当记录插入BookingUserReferenceValue时,它将被加密。列BookingGserReferenceValue的数据类型是Varbinary(256)。当我尝试更新该列中的记录时,我收到错误:
在上下文中指定的非布尔类型的表达式 条件是预期的,接近')'。
任何想法都错了? 感谢
答案 0 :(得分: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)))
';
答案 1 :(得分:1)
如果我们在IF
语句,WHERE
子句,HAVING
子句等中编写非布尔表达式,则会出现语法错误。请检查您的代码。
答案 2 :(得分:0)
我认为SELECT列表中缺少OldValue。我不确定为什么你没有得到列数不匹配的错误。