2016-09-02 39 views
0

我不得不说我对SQL Server触发器非常陌生,但我希望一些好的samaritan能帮助我解决这个问题。我想设置一个触发器,用于检查记录是否已添加到表中,如果是这样,则将一系列记录插入到不同的表中,从而将时间添加到受监视表中的时间戳。我已经写了我很容易理解的伪代码,这将有助于创建这些触发器。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位)表

Que RY为BatchDetailID:。

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

FROM [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和SampleAge从SampleAge表的SampleAge列DATEADD函数。然后 将遍历样本时间表,并为每个具有相同SiteID的样本插入一条记录。

回答

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 
+0

这是完美的谢谢非常。我还有一个问题可以简化这个触发器。我将添加到主帖子。 @liotims – llerdal