Sql server 使用SQL Server触发器插入备份表并将原始数据链接到备份
我正在尝试在SQL Server中实现以下逻辑: 每次将数据插入Sql server 使用SQL Server触发器插入备份表并将原始数据链接到备份,sql-server,triggers,Sql Server,Triggers,我正在尝试在SQL Server中实现以下逻辑: 每次将数据插入MainTable时,所有这些数据都应插入备份表MainTable\u backup,插入MainTable的每一行都应有一个外键BackupRecordId指向MainTable\u backup 可以使用触发器来实现吗 CREATE TRIGGER TRG_MainTable ON MainTable AFTER INSERT AS BEGIN INSERT INTO MainTable_BACKUP
MainTable
时,所有这些数据都应插入备份表MainTable\u backup
,插入MainTable
的每一行都应有一个外键BackupRecordId
指向MainTable\u backup
可以使用触发器来实现吗
CREATE TRIGGER TRG_MainTable
ON MainTable
AFTER INSERT AS
BEGIN
INSERT INTO MainTable_BACKUP
SELECT *
FROM INSERTED
-- UPDATE INSERTED SET BackupRecordId = ??? somehow...
END
是的,你可以
假设MainTable_BACKUP table上有一个名为BackupRecordId的标识列,您可以像下面这样创建一个after insert触发器
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方法确实允许不保持数据完整性的“后门”插入。)