【问题标题】:SQL Server trigger to save row revisions on UPDATE and INSERTSQL Server 触发器在 UPDATE 和 INSERT 上保存行修订
【发布时间】:2021-02-18 22:07:43
【问题描述】:

我有以下 SQL Server 触发器,我想执行以下操作:

  • INSERT 上,将Documents 中的新行保存到ArchivedDocuments
  • UPDATE 上,保存新的行修订如果 WordCountPageCountContributorCount 已从当前值更改为UPDATE

我如何做到这一点?

我当前的触发器只是在每个INSERTUPDATE 之后保存到ArchivedDocument

编辑Id 是文档表的主键。 DocumentId 是引用 Document.Id 的外键。

CREATE TRIGGER [TRG__Documents] 
ON [Documents]
AFTER INSERT, UPDATE
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @now datetimeoffset = sysdatetimeoffset();

    INSERT INTO [DocumentRevisions] ([DocumentId], [Time], [WordCount], [PageCount], [ContributorCount])
        SELECT
            [inserted].[Id],
            @now,
            [inserted].[WordCount],
            [inserted].[PageCount],
            [inserted].[ContributorCount]
        FROM  
            [inserted]
END

【问题讨论】:

    标签: sql sql-server triggers


    【解决方案1】:

    您需要EXCEPTdeleted 表中的任何匹配行。我假设Id 是主键,如果不是,那么您需要修改它以包含主键。

    create trigger [TRG__Documents] on [Documents]
        after insert, update
        as
        begin
            set nocount on;
            if(not exists (select 1 from inserted))
                return;
    
            declare @now datetimeoffset = sysdatetimeoffset();
            insert into [dbo].[DocumentRevisions] (
                [DocumentId],
                [Time],
                [WordCount],
                [PageCount],
                [ContributorCount]
            )
            select
                i.[Id],
                @now,
                i.[WordCount],
                i.[PageCount],
                i.[ContributorCount]
            from (
                select
                    i.[Id],
                    i.[WordCount],
                    i.[PageCount],
                    i.[ContributorCount]
                from inserted i
                except
                select
                    d.[Id],
                    d.[WordCount],
                    d.[PageCount],
                    d.[ContributorCount]
                from deleted d
            ) i
        end
    
    

    【讨论】:

    • 那你应该没问题。我还为零行插入添加了一个早期救助,最好也有,因为它可以防止触发器的其余部分运行,避免编译成本和锁定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多