Аудит журнала без использования вставленных или удаленных таблиц - PullRequest
0 голосов
/ 01 октября 2018

Мне нужно установить журнал аудита.Мне нужен способ сделать это без использования удаленных и вставленных таблиц.Я использую SQL Server Management Studio 2012.

Таблица A (первые записи).Страховщик и InsuranceResponsible - это коды для лиц.

Id YearReview    Insurer   InsuranceResponsible    TicketNr  InsReviewId  ReviewDate Comment IdInsurance

124   2017        1496         2345                TK201705     1        2017-09-29    Test     234
119   2017        1567         4567                TK201608     2        2017-09-29    Axa      1024
45    2016        1567         4567                TK201608     1        2016-05-30    All      1024 

Таблица A ( через несколько месяцев ) ** Примечание: yearReview и IdInsurance - никогда не бываетгод, чтобы иметь два одинаковых страхования.Таким образом, если кто-то делает проверку в страховании для определенного IdInsurance, он удалит последнюю запись, но он всегда будет регистрировать изменения.Должны быть зарегистрированы: @Insurer, @InsuranceResponsible, @TicketNr, @InsReviewId, @ comment.

Id YearReview    Insurer   InsuranceResponsible    TicketNr  InsReviewId  ReviewDate Comment IdInsurance

521   2018       2456         1459                TK201805     1        2018-09-29    Ti       1274
520   2017       1496         2345                TK201608     3        2018-09-29    Remove   1024     
124   2017       1496         2345                TK201705     1        2017-09-29    Test     234
119   2017       1567         4567                TK201608     2        2017-09-29    Axa      1024
45    2016       1567         4567                TK201608     1        2016-05-30    All      1024

Таблица B - Журнал аудита Таблица - заголовок таблицы был сделан другим человеком (я думаю,oldvalue и newvalue не очень хороши в журнальной таблице .. но теперь я должен придерживаться этого).Я не включил сюда LastChangeUser и LastChangeDate, но они существуют.

    Id    AlteredField  OldValue  NewValue  IdInsurance  CreationDate CreationUser Event

    34        n/a          n/a      n/a      1024         2016-05-30      1567   'New Review 2016'
    45      'InsReview'     1       2        1024         2017-09-29      1567   'Review 2017'
    46  
    (...)

    1000      n/a          n/a      n/a      1274         2018-09-29      2456   'NewReview 2018'  
    1001    'InsReview'     2       3        1024         2018-09-29     1486  'Review 2018'

одна возможность, я не уверен, что прав ...

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[sp_UpdateTableLog] 
     @IdInsurance int
    ,@YearReview char(4)
    ,@Insurer int
    ,@InsuranceResponsible int
    ,@TicketNr nvarchar(50)
    ,@InsReviewId int
    ,@comment nvarchar(255)

AS
BEGIN
    SET NOCOUNT ON;


    DECLARE @OldInsurer int
    DECLARE @OldInsuranceResponsible int
    DECLARE @OldTicketNr nvarchar(50)
    DECLARE @OldInsReviewId int
    DECLARE @OldComment nvarchar(255)


    -- SELECT OLD VALUES IN TABLE A 
    SET @OldInsurer = (SELECT TOP 1 [Insurer] from tableA WHERE Id = @IdInsurance and YearReview=@YearReview )
    SET @OldInsuranceResponsible = (SELECT TOP 1 [InsuranceResponsible] from tableA WHERE Id = @IdInsurance and YearReview=@YearReview )
    SET @OldTicketNr = (SELECT TOP 1 [TicketNr] from tableA WHERE Id = @IdInsurance and YearReview=@YearReview )
    SET @OldInsReviewId = (SELECT TOP 1 [InsReviewId] from tableA WHERE Id = @IdInsurance and YearReview=@YearReview  ) 
    SET @OldComment = (SELECT TOP 1 [Comment] from tableA WHERE Id = @IdInsurance and YearReview=@YearReview )
    SET @OldIdInsurance = (SELECT TOP 1 [IdInsurance] from tableA WHERE Id = @IdInsurance and YearReview=@YearReview )


    -- INSURER: EVALUATE IF SOMETHING HAS CHANGED
        IF @OldInsurer is not NULL

        BEGIN
        IF @OldInsReviewId <> @InsReviewId
                BEGIN 
                          INSERT INTO TableB ('InsReview',@OldInsReviewId,@InsReviewId,@IdInsurance,getdate(),@Insurer, concat('Review ' + year(getdate()) )
                    END

    same reasoning for the remaining 4.
        END

        ELSE   -- FOR the case where there are no lines in table B to compare, meaning a new review..

            BEGIN 
                  INSERT INTO TableB ('N/A','n/a','n/a',@IdInsurance,getdate(),@Insurer, concat('New Review ' + year(getdate()) )
            END
       END

Итак, мои вопросы:

1) согласны ли вы с хранимой процедурой, предназначенной для получения таблицы B, показанной выше?

2) Можно ли получить ту же таблицу B, избегая объявления переменных и не используя вставленные / удаленные таблицыSQL Server 2012?Возможно, нет.

1 Ответ

0 голосов
/ 01 октября 2018

Я рекомендую использовать deleted и inserted с UNPIVOT для этого шаблона таблицы аудита.Вопрос спрашивает, как сделать это без них ...

Хранимая процедура в вопросе сделает то, что вы пытаетесь сделать.Раздел, где читаются старые значения, может быть улучшен.Предложения FROM и WHERE одинаковы для всех запросов, так как они читают одну и ту же строку, поэтому должен быть один запрос.В старой версии таблица читается многократно, что ухудшает производительность и увеличивает нагрузку на базу данных, замедляя все остальное.Это не заметно с маленькой таблицей, но с несколькими сотнями миллионов строк такого рода вещи имеют большое значение.И, как мы уже установили, что Id и YearReview являются уникальным ключом, оператор TOP не нужен.

Так что SELECT OLD VALUES IN TABLE A будет лучше как:

SELECT 
  @OldInsurer = [Insurer]
, @OldInsuranceResponsible = [InsuranceResponsible]
, @OldTicketNr = [TicketNr]
, @OldInsReviewId = [InsReviewId]
, @OldComment = [Comment]
, @OldIdInsurance = [IdInsurance]
FROM tableA 
WHERE Id = @IdInsurance and YearReview=@YearReview
...