开发者社区 问答 正文

更新后的SQL触发器

只是一个问题,我试图创建一个触发器,该触发器将显示加载了多少条记录以及加载记录的第一个日期和最后一个日期

我还需要确定是否更新了相同的记录以及跟踪信息

我正在寻找的输出是这样的

tablename   recordcount mindate             maxdate               operation
customer    5000        2019/12/10 12:00    2019/12/10 12:15      INSERT
tablename   recordcount mindate             maxdate               operation
customer    2500        2019/12/10 12:20    2019/12/10 12:25      UPDATE
这是我使用的代码

ALTER TRIGGER [dbo].[utr_customer]
ON [dbo].[customer]
AFTER INSERT, UPDATE 
AS 
BEGIN 

IF UPDATE([Address])
BEGIN 
INSERT INTO [dbo].[TrackDataLoad](TableName,RecordCount,FirstRecord_LoadDate,LastRecord_LoadDate,[Operation])
SELECT
'[dbo].[customer]' AS TableName,
COUNT(*) AS RecordCount,
MIN(CreatedDate) AS FirstRecord_LoadDate,
MAX(CreatedDate) AS LastRecord_LoadDate,
'UPDT' AS [Operation],

FROM inserted
END 

ELSE

BEGIN
INSERT INTO [dbo].[TrackDataLoad](TableName,RecordCount,FirstRecord_LoadDate,LastRecord_LoadDate,[Operation])
SELECT
'[dbo].[customer]' AS TableName,
COUNT(*) AS RecordCount,
MIN(CreatedDate) AS FirstRecord_LoadDate,
MAX(CreatedDate) AS LastRecord_LoadDate,
'INS' AS [Operation],

FROM inserted
END
END

该代码将为所需的输出工作吗

因为我测试了一下,得到了这个结果集

tablename   recordcount mindate             maxdate             operation
customer    1           2019/12/10 12:00    2019/12/10 12:00    INSERT
customer    1           2019/12/10 12:01    2019/12/10 12:01    INSERT
customer    1           2019/12/10 12:02    2019/12/10 12:02    INSERT
customer    1           2019/12/10 12:03    2019/12/10 12:03    INSERT
customer    1           2019/12/10 12:04    2019/12/10 12:04    INSERT
customer    1           2019/12/10 12:05    2019/12/10 12:05    INSERT
customer    1           2019/12/10 12:06    2019/12/10 12:06    INSERT
customer    1           2019/12/10 12:07    2019/12/10 12:07    INSERT
customer    1           2019/12/10 12:08    2019/12/10 12:08    INSERT

展开
收起
心有灵_夕 2019-12-10 17:40:15 586 分享 版权
阿里云 AI 助理回答

你的触发器代码逻辑上是为每次插入或更新操作单独记录一行,而不是像你期望的那样汇总一次批量操作的所有记录。因此,当你一次性插入多条记录时,它会为每一条记录生成一个单独的跟踪记录,这解释了为什么你会看到每个时间点只有一条记录被插入的结果。

为了实现你想要的输出格式,即汇总一次操作中的所有记录信息,你需要修改触发器逻辑以处理整个批处理,而不是单个行。你可以通过计算inserted表中所有记录的总数、最小日期和最大日期来实现这一点。同时,根据是否进行了地址字段的更新来决定操作类型。以下是修改后的触发器示例:

ALTER TRIGGER [dbo].[utr_customer]
ON [dbo].[customer]
AFTER INSERT, UPDATE 
AS 
BEGIN
    DECLARE @Operation CHAR(4);

    IF EXISTS (SELECT 1 FROM inserted i INNER JOIN deleted d ON i.ID = d.ID WHERE i.Address <> d.Address)
        SET @Operation = 'UPDT';
    ELSE
        SET @Operation = 'INS';

    INSERT INTO [dbo].TrackDataLoad
    SELECT
        '[dbo].[customer]' AS TableName,
        COUNT(*) AS RecordCount,
        MIN(i.CreatedDate) AS FirstRecord_LoadDate,
        MAX(i.CreatedDate) AS LastRecord_LoadDate,
        @Operation AS Operation
    FROM inserted i;
END

这个修改后的触发器首先检查是否有任何记录的地址字段被更新(通过比较inserteddeleted表),然后基于这个判断设置操作类型。接着,它对整个inserted表进行聚合操作,计算总记录数、最早和最晚的创建日期,并将这些汇总信息作为单行插入到TrackDataLoad表中。

请注意,这里假设ID是主键或唯一标识符,用于在inserteddeleted表之间匹配记录。如果实际使用的主键或用于识别更新的字段不同,请相应地调整JOIN条件。此外,确保TrackDataLoad表的结构与预期的输出格式相匹配。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
SQL
问答地址: