Используйте триггер SQL Server для вставки в таблицу резервных копий и связывания оригинала с резервной копией

Я пытаюсь реализовать следующую логику в SQL Server:

каждый раз, когда данные вставляются в MainTable, все эти данные также должны быть вставлены в резервную таблицу MainTable_BACKUP, и каждая строка, вставленная в MainTable, должна иметь внешний ключ BackupRecordId, указывающий на MainTable_BACKUP.

Можно ли этого добиться с помощью триггера?

CREATE TRIGGER TRG_MainTable
ON MainTable
AFTER INSERT AS
BEGIN
    INSERT INTO MainTable_BACKUP 
        SELECT * 
        FROM INSERTED

    -- UPDATE INSERTED SET BackupRecordId = ??? somehow...
END

Обратите внимание, что хотя это можно сделать с помощью триггера, это окажет небольшое, но негативное влияние на производительность. Если это не проблема, то дерзайте. Если это проблема, рассмотрите возможность использования хранимой процедуры для вставки, чтобы данные последовательно вставлялись в резервную таблицу и основную таблицу в рамках транзакции. (Однако метод триггера обеспечит целостность данных. Использование метода SP позволяет вставлять «черный ход», который не поддерживает целостность данных.)

DeadZone 29.05.2019 19:34
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
1 279
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, ты можешь.

Предполагая, что у вас есть столбец идентификатора с именем BackupRecordId в вашей таблице MainTable_BACKUP, вы можете создать триггер после вставки, подобный этому

 Create Table MainTable
 (
    ID int IDENTITY(1, 1) PRIMARY KEY,
    Description NVARCHAR(50),
    BackupRecordId int
 )

 Create table MainTable_BACKUP
 (
    BackupRecordId int IDENTITY(1, 1) PRIMARY KEY,
    [Id] int,
    Description NVARCHAR(50)
 )

 CREATE TRIGGER TRG_MainTable
    ON MainTable
    AFTER INSERT AS
    BEGIN
        INSERT INTO MainTable_BACKUP([Id], Description) 
        SELECT [Id], Description FROM INSERTED

        UPDATE MainTable
        SET BackupRecordId = MP.BackupRecordId
        FROM MainTable
        INNER JOIN inserted i on i.Id = MainTable.Id
        INNER JOIN MainTable_BACKUP MP ON MP.Id = MainTable.Id
    END

Вы можете попробовать это с этим:

insert into MainTable(Description) 
values ('Testing')

select * from MainTable
select * from MainTable_BACKUP

Другие вопросы по теме