【发布时间】:2016-09-02 01:32:00
【问题描述】:
我不得不说我对 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 的样本插入一条记录。
【问题讨论】:
标签: sql sql-server database triggers