审计表 - 案例陈述

时间:2013-12-06 19:13:09

标签: sql case audit

我想要实现的目标:

当有人用(RegNum,VinNumber,CarMakeID等)更新Car表时,我需要将它放在审计表中。

在下面的示例中,我选择了CarID = 1和ChangeItem = 1(我希望代码使用案例的第一部分)。

如果我选择ChangeItem2,我希望它更新Car Table中的VinNumber并将deleted.VinNumber和Inserted.VinNumber插入审计表。

DECLARE @CarID INT
DECLARE @ChangedItem INT
DECLARE @Input VARCHAR(50)


SET @CarID  = 1
SET @ChangedItem = 1
SET @Input = 'LR44 GH345'

    UPDATE CAR
(   
CASE
        WHEN @ChangedItem = 1 THEN
        SET RegNum = @Input
        OUTPUT @CarID, @ChangedItem, deleted.RegNum, inserted.RegNum INTO CarAudit  (CarID, CarAuditObjectID, OldValue ,NewValue)
        WHERE CarID = @CarID

        WHEN @ChangedItem = 2 THEN
        SET VinNumber = @input
        OUTPUT @CarID, @ChangedItem, deleted.RegNum, inserted.RegNum INTO CarAudit  (CarID, CarAuditObjectID, OldValue ,NewValue)
        WHERE CarID = @CarID

END
)

如果有人有更好的方式完全这样做请分享,我并不会坚持使用这种设计。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

对于任何偶然发现此事的人。

我想避免使用触发器,因此使用以下代码将其放入sproc:

DECLARE @CarID INT
DECLARE @ChangedItem INT
DECLARE @Input VARCHAR(50)


SET @CarID  = 1
SET @ChangedItem = 2
SET @Input = 'PG 542DF 07GD 11'


IF @ChangedItem = 1

    BEGIN

        UPDATE CAR
        SET RegNum = @Input
        OUTPUT @CarID, @ChangedItem, deleted.RegNum, inserted.RegNum INTO CarAudit  (CarID, CarAuditObjectID, OldValue ,NewValue)
        WHERE CarID = @CarID

    END

IF @ChangedItem = 2

    BEGIN
        UPDATE CAR
        SET VINNumber = @Input
        OUTPUT @CarID, @ChangedItem, deleted.RegNum, inserted.RegNum INTO CarAudit  (CarID, CarAuditObjectID, OldValue ,NewValue)
        WHERE CarID = @CarID
    END

答案 1 :(得分:0)

我仍然建议使用触发器,它比你在存储过程中要做的更清晰。但是,如果你想坚持使用存储过程,你可以使用以下模式...(代码下面的解释)

Declare @ColumnName varchar(250)
Declare @Input varchar(250)
Declare @CarID int

Select @ColumnName = 'RegNum'
Select @Input = 'LR44 GH345'
select @CarID = 1

Begin Transaction
Declare @DynamicSQL varchar(max)

Select * Into #CarAuditTemp
From Car
Where CarID = @CarID

Select @DynamicSQL = '
Update Car
Set '+ @ColumnName +' = "'+ @Input +'"
Where CarID = '+ Convert(Varchar, @CarID) +' 
'


Select @DynamicSQL
--Execute (@DynamicSQL)

Select @DynamicSQL = '
Insert CarAudit
(CarID, ChangedItem, OldValue, NewValue)
Select  '+ Convert(Varchar, @CarID) +',
    "'+ @ColumnName +'",
    #CarAuditTemp.'+ @ColumnName +',
    Car.'+ @ColumnName +'
From Car
Inner Join #CarAudit
    On Car.CarID = #CarAuditTemp.CarID
'

Select @DynamicSQL
--Execute (@DynamicSQL)
Commit Transaction

@ColumnName,@ Input和@CarID都是存储过程的参数。这将使用动态SQL,以便您可以生成必要的SQL以使用您的值更新表,并插入到审计表中。我注释掉了执行并在动态sql变量上留下了选择,这样你就可以看到它的行为方式。 #CarAuditTemp临时表用于在更新任何内容之前获取记录的原始状态。最好还要进行一些错误检查,确保传递到存储过程中的列存在于该表中,确保传入的CarID也存在于表中,然后再执行其他操作。我添加了一个事务,因为如果在更新Car或插入CarAudit期间发生错误,则需要回滚所有内容。这只是您需要做的一般概念,如果您有任何问题,请告诉我。