Мне нужно установить журнал аудита.Мне нужен способ сделать это без использования удаленных и вставленных таблиц.Я использую 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?Возможно, нет.