帮助使用同一个表的其他列更新列

时间:2011-03-16 03:30:27

标签: sql oracle stored-procedures triggers

表:具有列Start_Time和End_Time的客户。

我需要添加一个新的“持续时间”列,即End_Time - Start_Time。 但是,我需要使用触发器或过程来执行此操作,以便在将新记录添加到Customer表后立即更新列Duration。

2 个答案:

答案 0 :(得分:3)

如果您使用的是MS SQL,理想的答案可能是计算列

您实际复制的数据越少,您将遇到的数据不一致的机会就越少,因此您的架构将导致一致性更低的保证/验证代码和更少的维护流程。

要进行此设置(再次,如果使用MS SQL),只需使用设计器添加另一列,然后展开“计算列规范”区域。 (您可以参考同一个表中的其他列进行此计算。)然后输入“End_Time - Start_Time”。根据您要对此数据执行的操作,可能需要为您的公式使用DATEDIFF(minute,Start_Time,End_Time)等内容。这正是这个功能的用途。

如果这是一个非常昂贵的计算(你可能没有,根据你给出的信息),你可以将结果配置为“持久” - 这非常像触发器,但实现和维护更清晰。 / p>

或者,您可以创建一个执行相同计算的新视图,并在获取信息时通过它“投影”第一个表。但是你可能已经知道了,因此这个答案就诞生了! :)

P.S。我个人建议避免像瘟疫一样的触发器。它们会导致开发人员,维护人员或管理员通常不期望的额外操作。这可能导致操作失败,返回意外的额外结果集,或修改管理员特别试图避免在管理(读取:不支持的 grin )修复期间修改的行。

p.p.s。在这种情况下,我还建议针对存储过程,出于与触发器相同的维护原因。虽然您可以限制安全性,以便更新表的唯一方法是通过存储过程,但这可能会因触发器失败的许多相同原因而失败。如果可以,最好避免重复数据。

p.p.p.s :)这并不是说存储过程整体上都不好。对于复杂的事务操作或对大型相关表的紧密集成的过程过滤,为了返回相对较小的结果集,它们仍然是最佳选择。

答案 1 :(得分:3)

按照shannon,虽然oracle中的术语是“Virtual Column” 增加了11g。在此之前,使用视图(这仍然是11g的潜在答案)。

请勿使用触发器或存储过程。