0

我正在 SQL Server 2000 中构建一个数据库,需要通过测试外键违规来执行数据验证。这篇文章与我之前的一篇文章(Trigger exits on first failed insert and cant set xact_abort OFF in SQL Server 2000)有关,该文章重点介绍了如何从工作 SQL Server 2005 实现移植到 server 2000 实现。根据在这篇文章中收到的建议需要批发重新编码,我现在正在重新考虑设计本身——因此这篇文章。回顾一下我的申请,我的

  • 我收到一个包含约 5k 条记录的每日数据馈送到一个暂存表中。当这个插入完成时,一条记录会被添加到一个名为 TRIGGER_DATA 的表中。
  • 我在该表上创建了一个“插入时”触发器,然后尝试将其中的数据一次插入 FACT_data 表中的一条记录。
  • FACT_data 表是许多 DIM 表的外键,这些表定义了字段可以接受的输入。
  • 如果任何记录违反外键约束,则插入应该失败,并且应该将记录插入到 Load_error 表中(该表没有外键并且所有字段都可以为空)。

考虑到每次插入中的记录量,我认为在 Stage_data 表上创建触发器不是一个好主意,因为这会导致每天一次性触发约 5k 触发器。但是,由于我无法在 SQL Server 2000 下的触发器中将 xact_abort 设置为关闭,因此在第一次失败时它会在触发器中中止,我想知道它是否实际上是一个不错的解决方案。

问题:

  1. 我现在问自己的基本问题是执行此操作的典型方法是什么——在我看来,通过检查 FK 违规进行的这种数据验证必须很常见,因此可能已经出现了共识最佳实践(尽管我真的不能为 server 2000 平台找到任何一个!)
  2. 考虑到每个插入中的记录量,我是否正确地认为 stage_data 表上的触发器是不好的做法,还是可以接受?
  3. 我从触发器中循环遍历每条记录并测试插入的方法是否可以?
  4. 你对我刚刚想到的这个替代方案有什么看法。完全停止使用触发器,并在加载 Stage 表后,使用一条记录更新“堆栈”表,该记录表明数据已被接收并准备好进行验证并加载到 FACT 表(可能连同指示顺序的优先级)必须处理哪些订单任务)。然后,此堆栈或“作业”表将成为所有请求插入及其状态(已创建/进行中/已完成)的寄存器。然后我会有一个存储过程不断地轮询这个表并处理最高优先级的记录。这意味着所有存储的过程调用都将在触发器之外发生。

非常感谢

4

1 回答 1

0

你根本不需要触发器。除非出于某种原因您需要对每日数据加载进行瞬间计时,否则只需安排一个作业(存储过程),该作业根据需要经常运行以在暂存表中查找数据。

当它找到任何记录时,一次处理一个记录并加载正常的记录,并对已损坏 FK 的记录执行任何操作(删除、移动到工作队列等)。

如果您使用的调度频率通常足够高,以至于在最后一个作业仍在运行时存在下一个作业开始的风险,那么您应该创建一个哨兵表,您的存储过程可以写入该表来说明该作业正在运行。这可以以两种方式之一起作用。要么您只有一条记录显示“正在运行”或“未运行”,要么您可以为每个作业拥有一条记录(如事务日志),其中包含指示作业是否完成的状态代码。

于 2013-03-17T12:22:44.047 回答