Jam*_*son 5 sql-server triggers
我在一家安全承包公司工作,我的数据库中有一个表,用于存储已工作 PO 的调整时间/时间。对于每个工作的日期,财务部门将输入供应商的计费开始和结束时间,以及客户的计费开始和结束时间。大多数情况下,供应商和客户的计费时间是相等的,但极少数情况除外。
我们系统的工作方式是,供应商开始和结束时间始终更新客户端开始和结束时间,除非客户端开始和结束时间与供应商开始和结束时间不同。为了存储这些信息,我有一个包含这些列的表:
由于供应商和客户端的开始和结束时间通常需要彼此保持同步,我想我会使用触发器来处理它。因为我需要访问当前值以将它们与新值进行比较,似乎 INSTEAD OF INSERT, UPDATE 触发器是要走的路,除了我一开始并不热衷于触发器,并且依赖于执行我所有插入和更新到这个表的触发器让我很紧张。也许这是我有一种非理性的恐惧,但我通常会尽量远离触发器。然而,在这种情况下,这似乎是最好的选择。
这是我的触发器,它应该使逻辑清晰:
ALTER TRIGGER [dbo].[<UpdateAdjustedHours>]
ON [dbo].[<AdjustedHoursTable>]
INSTEAD OF INSERT, UPDATE
AS
BEGIN
IF (NOT EXISTS(SELECT CurrentValues.JobID FROM WorkOrderDetailAdjustment CurrentValues, Inserted NewValues WHERE CurrentValues.JobID = NewValues.JobID AND CurrentValues.PostNumber = NewValues.PostNumber))
BEGIN
INSERT INTO WorkOrderDetailAdjustment
SELECT Inserted.JobID,
Inserted.PostNumber,
Inserted.StartTime,
Inserted.ClosingTime,
ISNULL(Inserted.ClientStartTime, Inserted.StartTime),
ISNULL(Inserted.ClientClosingTime, Inserted.ClosingTime)
FROM Inserted
END
ELSE BEGIN
UPDATE CurrentValues
SET CurrentValues.StartTime = ISNULL(NewValues.StartTime, CurrentValues.StartTime),
CurrentValues.ClosingTime = ISNULL(NewValues.ClosingTime, CurrentValues.ClosingTime),
CurrentValues.ClientStartTime = (
CASE WHEN DATEDIFF(SECOND, CurrentValues.ClientStartTime, CurrentValues.StartTime) != 0 THEN
ISNULL(NewValues.ClientStartTime, CurrentValues.ClientStartTime)
ELSE
NewValues.StartTime
END
),
CurrentValues.ClientClosingTime = (
CASE WHEN DATEDIFF(SECOND, CurrentValues.ClientClosingTime, CurrentValues.ClosingTime) != 0 THEN
ISNULL(NewValues.ClientClosingTime, CurrentValues.ClientClosingTime)
ELSE
NewValues.ClosingTime
END
)
FROM WorkOrderDetailAdjustment CurrentValues, Inserted NewValues
WHERE CurrentValues.JobID = NewValues.JobID AND CurrentValues.PostNumber = NewValues.PostNumber
END
END
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更好的方法来做到这一点。我对所有建议持开放态度,但如果可能的话,我希望将其保留在数据库级别。我也很乐意听到我选择了最好的方式来做到这一点,但出于某种原因,我对此表示怀疑。
感谢您的帮助!
您可以做的一件事...如果对您的操作有意义的话,就是向表中添加持久计算列。(我从您的描述中推断您实际上希望存储此值。如果不是,则不需要持久选项)。
它可能类似于合并(client_start_time,vender_start_time)。
或者,您可以创建执行相同操作的视图。我并不热衷于观点,因为它们很容易被滥用,但它们并不总是坏事。
无论哪种方式,您只需输入 client_start 时间(当它实际上与 vender_start_time 不同时)。您可以避免使用触发器。
| 归档时间: |
|
| 查看次数: |
9888 次 |
| 最近记录: |