【问题标题】:SQL Server trigger to add future records to tableSQL Server 触发器将未来的记录添加到表中
【发布时间】: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


    【解决方案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
    

    【讨论】:

    • 这太完美了,非常感谢。我还有另一个问题要简化此触发器。我将添加到主帖。 @liotims
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    相关资源
    最近更新 更多