Обновить временную таблицу без обновления истории
У меня есть временная таблица Person with PersonHistory.
Столбцы: [Id], [Name], [DepartmentId], [ModifiedBy], [SysStartTime] и [SysEndTime].
При физическом удалении строки я хочу сохранить, кто удалил строку в ModifiedBy, не добавляя 2 строки в PersonHistory.
Есть идеи, как мне этого добиться?
Благодарю.
1 ответ
Это можно сделать, но это было бы немного хакерским. Кроме того, вы потеряете историю того, кто изменил строку в ее текущее состояние (например, user1 создает запись с именем "jams". User2 изменил имя на "james". User 3 удалил строку. В истории вы бы не стали см. user2's edit из '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