SQL Server触发器。需要帮忙

时间:2011-01-27 08:44:50

标签: sql-server triggers

我有一个包含这些列的表:

  • 债务
  • 支付
  • 仍然

每当更新paid列时,我都需要使用以下计算重新计算remained debt减去paid

有人可以帮助我实现这个目标吗?

5 个答案:

答案 0 :(得分:4)

您可以考虑使用computed column

article具有从头开始创建或添加到现有架构的语法,

ALTER TABLE yourtable ADD remainder AS debt - paid

答案 1 :(得分:4)

给出表

CREATE TABLE [MyTable]
(
    MyTablePK int,
    debt numeric(10,2),
    paid numeric(10,2),
    remainder numeric(10,2)
)

以下触发器将重新计算字段剩余

CREATE TRIGGER tMyTable ON [MyTable] FOR INSERT, UPDATE
AS
    BEGIN
              SET NOCOUNT ON
        UPDATE mt
            Set mt.Remainder = mt.Debt - mt.Paid
            FROM [MyTable] mt INNER JOIN Inserted i
            on mt.MyTablePK = i.MyTablePK
    END

你也可以将Remainder定义为Computed persisted列,它具有类似的效果而没有触发器的副作用

答案 2 :(得分:3)

为什么SQL可以为您执行触发器中的计算,并且您不必担心触发器被禁用等等:

CREATE TABLE T (
    /* Other columns */
    Debt decimal (18,4) not null,
    Paid decimal (18,4) not null,
    Remained as Debt-Paid
)

这称为计算列

答案 3 :(得分:2)

create trigger DebtPaid
on DebtTable
after insert, update
as if update(paid)
begin
    update DebtTable
    set remained = inserted.debt - inserted.paid
    where customerId = inserted.customerId
end

http://msdn.microsoft.com/en-us/library/ms189799.aspx

http://benreichelt.net/blog/2005/12/13/making-a-trigger-fire-on-column-change/

答案 4 :(得分:1)

计算列可以很好但是它们是在运行中计算的并且不会存储在任何地方,因为执行长计算的大型查询具有物理的非重复值,其中Remained由触发控制可以比计算列更好。

在您的触发器中,记住只更新已更新的行,您可以通过虚拟表访问那些已插入已删除的触发器。