Обновить темпоральную таблицу без обновления истории

У меня есть временная таблица Person с PersonHistory.

Столбцы:

[Id], [Name], [DepartmentId], [ModifiedBy], [SysStartTime], [SysEndTime]

При физическом удалении строки я хочу сохранить, кто удалил строку в ModifiedBy, не добавляя 2 строки в PersonHistory.

Любые идеи о том, как я могу достичь этого?

Спасибо.


person Timvr01    schedule 17.06.2018    source источник


Ответы (1)


Это можно сделать, но это будет немного взломано. Также вы потеряете историю того, кто изменил строку в ее текущее состояние (например, пользователь 1 создает запись с именем «jams». Пользователь 2 изменил имя на «james». Пользователь 3 удалил строку. В истории вы не см. редактирование user2 с «jams» на «james», просто удаление user3 строки с именем «james»), так что вы немного теряете контрольный след

Это может работать в триггере, я не уверен, но если вы ограничили действие удаления для рассматриваемой таблицы SPROC, это можно было бы сделать следующим образом:

CREATE PROC [People].[Person_Delete]
(
    @Id INT,
    @DeletedBy VARCHAR(255)
)
AS
BEGIN
    BEGIN TRY
        BEGIN TRANSACTION

            --===========================================================================================
            --TURN OFF SYSTEM VERSIONING FOR THE TARGET TABLE
            --===========================================================================================
            IF (SELECT temporal_type FROM sys.tables WHERE object_id = OBJECT_ID('People.Person', 'U')) = 2
            BEGIN
                EXEC(N'
                    PRINT(''Deactivating SYSTEM_VERSIONING for People.Person...'')
                    ALTER TABLE People.Person
                    SET (SYSTEM_VERSIONING = OFF)
                    ALTER TABLE People.Person
                    DROP PERIOD FOR SYSTEM_TIME
                ')
            END

            --===========================================================================================
            --UPDATE THE ModifiedBy VALUE
            --===========================================================================================

            UPDATE People.Person
            SET ModifiedBy = @DeletedBy
            WHERE Id = @Id

            --===========================================================================================
            --TURN ON SYSTEM VERSIONING FOR THE TARGET TABLE
            --===========================================================================================
            IF (SELECT temporal_type FROM sys.tables WHERE object_id = OBJECT_ID('People.Person', 'U')) = 0 
            BEGIN 
                EXEC(N' 
                    PRINT(''Activating SYSTEM_VERSIONING for People.Person...'') 
                    ALTER TABLE People.Person 
                    ADD PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime) 
                    ALTER TABLE People.Person 
                    SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE=People.PersonHistory, DATA_CONSISTENCY_CHECK=ON)) 
                ')
            END

            --===========================================================================================
            --DELETE THE RECORD
            --===========================================================================================
            DELETE People.Person
            WHERE Id = @Id

        COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        IF @@TRANCOUNT > 0
            ROLLBACK TRANSACTION

        ;THROW;
    END CATCH
END
person jluetzenberg    schedule 17.06.2018
comment
Вы правы в том, что я потеряю часть контрольного следа. Я думаю, что просто обновлю строку, а затем удалю ее. Но все равно спасибо за возможное решение моего вопроса. - person Timvr01; 18.06.2018