我有一个包含大量列的表stockm
,但我的触发器仅基于其中两个。
我希望触发器在held_flag
列中的值更新或插入y
或Y
时发送电子邮件,但仅在列{{ 1}}值为warehouse
。
让我知道我错在哪里。
我在表中没有提到主键
KW
答案 0 :(得分:0)
让我们倒退一步,思考这种方法。首先,触发器在事务中运行。该事务可能未提交,因为插入的任何行都不会永久保存在数据库中。因此,从触发器发送电子邮件的想法是一个有问题的操作,因为该电子邮件可能会引用实际不存在的信息。
接下来,交易应该很快。您不应该执行可能需要很长时间的逻辑。发送电子邮件通常不需要太多时间 - 但是当您的电子邮件服务器无法正常工作时会发生什么?您的OLTP系统是否只是停止工作?这是您系统中可接受的风险吗?
最后,触发器以语句为基础运行。如果语句影响2000行,则虚拟插入/删除表中将存在2000行(取决于操作)。要正确编写触发器,必须编写逻辑来处理任意数量的行 - 从零(是,零!)到多个行。您认为单行受到影响 - 这绝不是一个安全的假设。由于这个假设,我还可以猜测您的测试不包括实际影响多行的情况。这是你需要改变的东西 - 越快越好。
如果您需要更好的设计建议,那么您需要提供有关目标和架构的信息。没有人能真正猜出你的表/列实际代表什么,因为它们不是特别有意义的名字。您的读者也不了解您正在建模的实际系统 - 因此无法从您的描述中推断出业务功能。
最后一件事。如果您打算使用tsql发送电子邮件,您将需要向sp_send_dbmail过程提供正确的信息。如果你还不知道如何做到这一点,那么试图将其置于触发器中显然也不会起作用。将您的问题分解为可以实施和测试的部分。