只是一个问题,我试图创建一个触发器,该触发器将显示加载了多少条记录以及加载记录的第一个日期和最后一个日期
我还需要确定是否更新了相同的记录以及跟踪信息
我正在寻找的输出是这样的
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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
你的触发器代码逻辑上是为每次插入或更新操作单独记录一行,而不是像你期望的那样汇总一次批量操作的所有记录。因此,当你一次性插入多条记录时,它会为每一条记录生成一个单独的跟踪记录,这解释了为什么你会看到每个时间点只有一条记录被插入的结果。
为了实现你想要的输出格式,即汇总一次操作中的所有记录信息,你需要修改触发器逻辑以处理整个批处理,而不是单个行。你可以通过计算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
这个修改后的触发器首先检查是否有任何记录的地址字段被更新(通过比较inserted
和deleted
表),然后基于这个判断设置操作类型。接着,它对整个inserted
表进行聚合操作,计算总记录数、最早和最晚的创建日期,并将这些汇总信息作为单行插入到TrackDataLoad
表中。
请注意,这里假设ID
是主键或唯一标识符,用于在inserted
和deleted
表之间匹配记录。如果实际使用的主键或用于识别更新的字段不同,请相应地调整JOIN条件。此外,确保TrackDataLoad
表的结构与预期的输出格式相匹配。