繁体   English   中英

如何在sybase触发器中的特定列更新之前将行从一个表复制到另一个表?

[英]how to copy row from one table to another before update on specific column in sybase trigger?

我想在特定列进行更新之前将行从一个表复制到另一表。 我的表格中名为StartDateTime_列。 如果触发不正确或需要优化,任何人都可以纠正此触发。

CREATE TRIGGER PeriodicHistory_TR_U ON order_db..Periodic
FOR UPDATE
AS IF update(StartDateTime_)
begin
        declare @Identity_;
        declare @Version_;
        DECLARE @Revision_;
        declare @Identifier_;
        declare @CreationTime_;
        declare @CreationUserId_;
        declare @StartDateTime_;        

        SELECT @Identity_= i.Identity_ from inserted i;
        SELECT @Version_= i.Version_ from inserted i;
        SELECT @Identifier_= i.Identifier_ from inserted i;
        SELECT @CreationTime_= i.CreationTime_ from inserted i;
        SELECT @CreationUserId_= i.CreationUserId_ from inserted i;
        SELECT @StartDateTime_= i.StartDateTime_ from inserted i;

        set @Revision_ = @Version_ +1;

 insert into order_db..PeriodicHistory(Identity_,Version_,Revision_,Identifier_,CreationTime_,CreationUserId_,StartDateTime_)

values(@Identity_,@Version_,@Identifier_,@CreationTime_,@CreationUserId_,@StartDateTime_);
end

这个怎么样:

CREATE TRIGGER PeriodicHistory_TR_U ON Periodic
FOR UPDATE
AS IF update(StartDateTime_)
BEGIN
    INSERT INTO     PeriodicHistory(Identity_,Version_,Revision_,Identifier_,CreationTime_,CreationUserId_,StartDateTime_)
    SELECT  d.Identity_,d.Version_,d.Revision_ + 1,d.Identifier_,d.CreationTime_,d.CreationUserId_,d.StartDateTime_
    FROM    deleted d
    JOIN    inserted i
    ON      d.Identity_ = i.Identity_
END

这消除了对临时变量的需要。

想一想,如果定期更新影响多于一行,会发生什么情况。 原始触发器将无法存储多个值...

另外,我修改后的触发器将以与原始触发器相同的方式更新历史记录表中的版本。 您可能想要更新周期表中的版本,并将旧值保留在历史记录中。 由于十次更新之后,您可能会得到以下结果:Periodic.Version_ = 1 PeriodicHistory.Version_ = 2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM