Я пытаюсь реализовать следующую логику в 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
Да, ты можешь.
Предполагая, что у вас есть столбец идентификатора с именем 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
Обратите внимание, что хотя это можно сделать с помощью триггера, это окажет небольшое, но негативное влияние на производительность. Если это не проблема, то дерзайте. Если это проблема, рассмотрите возможность использования хранимой процедуры для вставки, чтобы данные последовательно вставлялись в резервную таблицу и основную таблицу в рамках транзакции. (Однако метод триггера обеспечит целостность данных. Использование метода SP позволяет вставлять «черный ход», который не поддерживает целостность данных.)