SQL Server触发器将未来的记录添加到表中

时间:2016-09-02 01:32:00

标签: sql sql-server database triggers

我不得不说我对SQL Server触发器很新,但我希望一些好的撒玛利亚人会帮助我解决这个问题。我想设置一个触发器来检查是否已将记录添加到表中,如果是,则将一系列记录插入到不同的表中,从而将时间添加到受监控表中的时间戳。我已经写了一些我很容易理解的伪代码,它将有助于创建这些触发器。

如果tBatch表中有一个具有特定批次ID的新记录,则将记录插入DeSchedule

查询tBatch中的新记录并从tBatch中提取数据:

SELECT  
    b.BatchID, b.fermNumber, b.BatchStartTime, b.PropStartTime, b.SiteID
FROM 
    [DDIApplication].[dbo].[tBatch] b
INNER JOIN 
    [DDIApplication].[dbo].[tBatchDetails] bd ON b.id = bd.BatchDetailID

触发

如果tBatch中有新记录,请在DeSchedule

中创建这些记录

DeSchedule架构

| ID | SiteID | Timestamp | BatchID | FermNumber | SampleAge | Ethanol | Glucose | SampleCompleted |

DeSchedule

中创建这些记录
insert into DeSchedule(DATEADD(hour, 6, PropStartTime), 6666, 1, YP6, , , )

insert into DeSchedule(DATEADD(hour, 10, PropStartTime), 6666, 1, YPD, , , )

insert into DeSchedule(DATEADD(hour, 10, BatchStartTime), 6666, 1, 10, , , )

insert into DeSchedule(DATEADD(hour, 20, BatchStartTime), 6666, 1, 20, , , )

insert into DeSchedule(DATEADD(hour, 30, BatchStartTime), 6666, 1, 30, , , )

insert into DeSchedule(DATEADD(hour, 40, BatchStartTime), 6666, 1, 40, , , )

insert into DeSchedule(DATEADD(hour, 50, BatchStartTime), 6666, 1, 50, , , ) 

insert into DeSchedule(DATEADD(hour, 65, BatchStartTime), 6666, 1, DROP, , , )

insert into DeSchedule(DATEADD(hour, 70, BatchStartTime), 6666, 1, BW, , , )

附加触发器

将记录输入tBatchDetails后,请检查DeSchedule以尝试匹配(BatchID,SampleAge,SiteID)

如果找到记录更新记录并从tBatchDetails表中插入(乙醇,葡萄糖并检查SampleCompleted Bit)

查询BatchDetailID

SELECT 
   [BatchDetailID], [ID],
   [SampleTimeStamp],
   [SampleAge], [Glucose], [Ethanol]

这        [DDIApplication] [DBO]。[tBatchDetails]

tBatchDetails架构

| ID | TimeStamp | BatchTableID | SampleAge | BatchID | Ethanol | Glucose |

已修改

没有写出触发器中的所有插入,而是有一种方法可以遍历SampleAge表并为每个SampleAge插入一条记录。

SampleAge表架构

| SiteID | SampleAge | ScheduleTime |
|   1    |    YP6    |      6       |

所以而不是:

insert into DeSchedule ([SiteID],[PreTimeStamp],[BatchID],[FermNumber],[SampleAge],[Ethanol],[Glucose],[SampleCompleted]) 
select SiteID, DATEADD(hour, 4, PropStartTime), BatchID, FirmNum, '4Hrs', NULL , NULL ,NULL  
from INSERTED 

它将从ScheduleTime获取dateadd函数的小时数,并从SampleAge表的SampleAge列获取SampleAge。然后呢 将循环遍历样本年龄表并为具有相同SiteID的每个样本插入记录。

1 个答案:

答案 0 :(得分:1)

这是tBatch表的触发器(使插入代码适应代码以准确插入所需内容):

USE [test] --Change by your database Name
GO

CREATE TRIGGER Trigger_Insert_into_DeSchedule ON [dbo].[tBatch] 
AFTER INSERT 
AS 

BEGIN
insert into DeSchedule ([SiteID],[Timestamp],[BatchID],[FermNumber],[SampleAge],[Ethanol],[Glucose],[SampleCompleted]) 
select SiteID, DATEADD(hour, 6, PropStartTime), BatchID, 6666, 1, 'YP6', NULL , NULL  from INSERTED

insert into DeSchedule ([SiteID],[Timestamp],[BatchID],[FermNumber],[SampleAge],[Ethanol],[Glucose],[SampleCompleted]) 
select SiteID, DATEADD(hour, 10, PropStartTime), BatchID, 6666, 1, 'YPD', NULL , NULL  from INSERTED

insert into DeSchedule ([SiteID],[Timestamp],[BatchID],[FermNumber],[SampleAge],[Ethanol],[Glucose],[SampleCompleted]) 
select SiteID, DATEADD(hour, 10, PropStartTime), BatchID, 6666, 1, '10', NULL , NULL  from INSERTED

insert into DeSchedule ([SiteID],[Timestamp],[BatchID],[FermNumber],[SampleAge],[Ethanol],[Glucose],[SampleCompleted]) 
select SiteID, DATEADD(hour, 10, PropStartTime), BatchID, 6666, 1, '20', NULL , NULL  from INSERTED

insert into DeSchedule ([SiteID],[Timestamp],[BatchID],[FermNumber],[SampleAge],[Ethanol],[Glucose],[SampleCompleted]) 
select SiteID, DATEADD(hour, 10, PropStartTime), BatchID, 6666, 1, '30', NULL , NULL  from INSERTED

insert into DeSchedule ([SiteID],[Timestamp],[BatchID],[FermNumber],[SampleAge],[Ethanol],[Glucose],[SampleCompleted]) 
select SiteID, DATEADD(hour, 10, PropStartTime), BatchID, 6666, 1, '40', NULL , NULL  from INSERTED

insert into DeSchedule ([SiteID],[Timestamp],[BatchID],[FermNumber],[SampleAge],[Ethanol],[Glucose],[SampleCompleted]) 
select SiteID, DATEADD(hour, 10, PropStartTime), BatchID, 6666, 1, '50', NULL , NULL  from INSERTED

insert into DeSchedule ([SiteID],[Timestamp],[BatchID],[FermNumber],[SampleAge],[Ethanol],[Glucose],[SampleCompleted]) 
select SiteID, DATEADD(hour, 10, PropStartTime), BatchID, 6666, 1, 'DROP', NULL , NULL  from INSERTED

insert into DeSchedule ([SiteID],[Timestamp],[BatchID],[FermNumber],[SampleAge],[Ethanol],[Glucose],[SampleCompleted]) 
select SiteID, DATEADD(hour, 10, PropStartTime), BatchID, 6666, 1, 'BW', NULL , NULL  from INSERTED

END

GO

tBatchDetails表的触发器:

USE [test] --Change by your database Name
GO

CREATE TRIGGER Trigger_update_details_DeSchedule ON [dbo].[tBatchDetails]
    AFTER INSERT 
AS 


BEGIN
    DECLARE @BatchId int, @Ethanol varchar(10), @Glucose varchar(10), @SampleAge varchar(10);
    SELECT @BatchId = [BatchTablelID],@Ethanol = [Ethanol], @Glucose= [Glucose], @SampleAge = [SampleAge]  from INSERTED

    update [dbo].[DeSchedule] SET [Ethanol] = @Ethanol, [Glucose] = @Glucose WHERE [BatchID] = @BatchId AND [SampleAge] = @SampleAge

END

GO