Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用SQL Server触发器插入备份表并将原始数据链接到备份_Sql Server_Triggers - Fatal编程技术网

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

我正在尝试在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 
        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方法确实允许不保持数据完整性的“后门”插入。)