我不得不说我对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的每个样本插入记录。
答案 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