Сбор обновленных значений в таблице с использованием триггера - PullRequest
2 голосов
/ 30 июня 2019

У меня есть ситуация, у меня есть таблица из более 30 столбцов, созданная таблица аудита с тем же количеством столбцов и несколькими дополнительными столбцами, как описание, с обновленным типом столбцов даты. нужен триггер, чтобы собирать обновленные столбцы и собирать их в виде описания, а также нужно формировать предложение, как и так, и поля обновляются в таблице аудита. Помощь с примером триггера будет оценена. Заранее спасибо ..

ALTER TRIGGER [dbo].[trg_reservationdetail_audit]
ON [dbo].[tblReservationDetails]
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
    SET NOCOUNT ON;
    INSERT reservationDetails_audits(
        reservationDetailId,
        reservationId,
        rdCreationDate,
        rdItemTypeId,
        rdDeparture,
        rdArrival,
        rdPax,
        PaxChildren,
        PaxBabies,
        rdStatusId,
        rdIsCancelled,
        rdPackageId,
        rdRateId,
        rdPrice,
        rdTaxId,
        rdRoomId,
        rdTaxAmount,
        rdDays,
        siteId,
        CreatorID,
        CreatorName,
        Updated,
        UpdatedBy,
        Amount,
        Segment_ID,
        Source_ID,
        Remarks,
        SessionId,
        Contact_ID,
        CreatorContactProfileID,
        HotelReservationUniqueID,
        HotelReservationResID_Value,
        RoomStayId,
        ChnMgrContent_ID,
        InvoiceTo,
        SourceContext,
        BlockRoomChange,
        BlockRoomChangeReasonId,
        rdinvoiceid,
        isOnHoldResDet,
        updated_at,
        Operation,
        Description)
     SELECT
       i.reservationDetailId,
        reservationId,
        rdCreationDate,
        rdItemTypeId,
        rdDeparture,
        rdArrival,
        rdPax,
        PaxChildren,
        PaxBabies,
        rdStatusId,
        rdIsCancelled,
        rdPackageId,
        rdRateId,
        rdPrice,
        rdTaxId,
        rdRoomId,
        rdTaxAmount,
        rdDays,
        siteId,
        CreatorID,
        CreatorName,
        Updated,
        UpdatedBy,
        Amount,
        Segment_ID,
        Source_ID,
        Remarks,
        SessionId,
        Contact_ID,
        CreatorContactProfileID,
        HotelReservationUniqueID,
        HotelReservationResID_Value,
        RoomStayId,
        ChnMgrContent_ID,
        InvoiceTo,
        SourceContext,
        BlockRoomChange,
        BlockRoomChangeReasonId,
        rdinvoiceid,
        i.isOnHoldResDet,           
        GETDATE(),
   CASE WHEN EXISTS (SELECT * FROM Deleted) THEN 'UPD' ELSE 'INS' END
FROM
   Inserted I
UNION ALL
SELECT
       d.reservationDetailId,
        reservationId,
        rdCreationDate,
        rdItemTypeId,
        rdDeparture,
        rdArrival,
        rdPax,
        PaxChildren,
        PaxBabies,
        rdStatusId,
        rdIsCancelled,
        rdPackageId,
        rdRateId,
        rdPrice,
        rdTaxId,
        rdRoomId,
        rdTaxAmount,
        rdDays,
        siteId,
        CreatorID,
        CreatorName,
        Updated,
        UpdatedBy,
        Amount,
        Segment_ID,
        Source_ID,
        Remarks,
        SessionId,
        Contact_ID,
        CreatorContactProfileID,
        HotelReservationUniqueID,
        HotelReservationResID_Value,
        RoomStayId,
        ChnMgrContent_ID,
        InvoiceTo,
        SourceContext,
        BlockRoomChange,
        BlockRoomChangeReasonId,
        rdinvoiceid,
        d.isOnHoldResDet,           
        GETDATE(),
        'DEL'
     FROM Deleted d
    WHERE NOT EXISTS (
   SELECT * FROM Inserted
);
END

Ожидается выборочный триггер с новым столбцом в таблице аудита в качестве описания, которое сформирует простое предложение для отображения пользователям.

1 Ответ

1 голос
/ 30 июня 2019

Незначительная проблема - сравнение пустых столбцов.Это можно сделать с помощью выражения ISNULL(NULLIF(i.Col, d.Col), NULLIF(d.Col, i.Col)) IS NOT NULL, которое имеет значение true, если строки inserted и deleted отличаются на Col.

INSERT reservationDetails_audits(
        reservationDetailId,
        reservationId,
        rdCreationDate,
        -- ..
        updated_at,
        Operation,
        Description)
SELECT
        i.reservationDetailId,
        i.reservationId,
        i.rdCreationDate,
        -- ..
        i.isOnHoldResDet,           
        GETDATE(),
        CASE WHEN d.reservationDetailId IS NOT NULL THEN 'UPD' ELSE 'INS' END,
        CASE WHEN d.reservationDetailId IS NOT NULL THEN
          ' updated cols: '
          -- assumming reservationId is not nullable
          + CASE i.reservationId <> d.reservationId THEN 'reservationId ' ELSE '' END 
          -- assumming rdCreationDate is nullable
          + CASE ISNULL(NULLIF(i.rdCreationDate, d.rdCreationDate), NULLIF(d.rdCreationDate, i.rdCreationDate)) IS NOT NULL THEN 'rdCreationDate ' ELSE '' END
          -- + ..
        ELSE '' END
FROM Inserted I
LEFT JOIN deleted d on d.reservationDetailId = i.reservationDetailId
UNION ALL
--  delete oper query

;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...