【问题标题】:If the field was essentially changed, then change the value of one of its column如果该字段实质上已更改,则更改其列之一的值
【发布时间】:2015-01-28 09:15:25
【问题描述】:

我有“要求”的精髓。如果用户在这种情况下更改了“描述”字段,它应该自动更改“稳定性”字段的值(下拉列表)。也就是说,如果你不得不改变需求的描述,它就会变得不稳定。我写了一个触发器

CREATE TRIGGER [ChangeStabilityRequirement]
ON [dbo].[Requirement] AFTER UPDATE
AS
BEGIN
    if update([Definition])
    begin
        update [Requirement] set Stability = 2 
        where RequirementId in (select RequirementId from inserted)
    end
end 

但问题是当表中有任何更改条目时触发器被激活。只需要响应“定义”列中的更改。

我的桌子

CREATE TABLE [dbo].[Requirement] (
    [RequirementId]                   INT            IDENTITY (1, 1) NOT NULL,
    [Rationale]                       NVARCHAR (MAX) NULL,
    [CreatedOn]                       DATE           CONSTRAINT [DF__Requireme__Creat__473C8FC7] DEFAULT (getdate()) NULL,
    [CurentVersion]                   NVARCHAR (MAX) NULL,
    [State]                           INT            NOT NULL,
    [Priority]                        INT            NOT NULL,
    [Type]                            INT            NOT NULL,
    [Source_BusinessRuleId]           INT            NULL,
    [Stability]                       INT            NOT NULL,
    [UserPart]                        NVARCHAR (MAX) NULL,
    [CreatedBy_UserId]                INT            NULL,
    [Responsible_UserId]              INT            NULL,
    [ImplementationVersion]           NVARCHAR (MAX) NULL,
    [ResponsibleId]                   INT            DEFAULT ((0)) NULL,
    [SourceId]                        INT            DEFAULT ((0)) NULL,
    [InterfacePoint_InterfacePointId] INT            NULL,
    [InterfacePointId]                INT            DEFAULT ((0)) NULL,
    [CreatedById]                     INT            DEFAULT ((0)) NULL,
    [Definition]                      NVARCHAR (MAX) DEFAULT ('') NOT NULL,
    CONSTRAINT [PK_dbo.Requirement] PRIMARY KEY CLUSTERED ([RequirementId] ASC),
    CONSTRAINT [FK_dbo.Requirement_dbo.User_CreatedById] FOREIGN KEY ([CreatedById]) REFERENCES [dbo].[User] ([UserId]),
    CONSTRAINT [FK_dbo.Requirement_dbo.User_ResponsibleId] FOREIGN KEY ([ResponsibleId]) REFERENCES [dbo].[User] ([UserId]),
    CONSTRAINT [FK_dbo.Requirement_dbo.BusinessRule_SourceId] FOREIGN KEY ([SourceId]) REFERENCES [dbo].[BusinessRule] ([BusinessRuleId])
);

更新表格 更新发生在 Web 应用程序界面中

这是来自 SQL SERVER 配置文件的查询

exec [dbo].[Requirement_Update] 
@RequirementId=32,
@Definition=N'Реализовать возможность выбора значения "Без пени" в поле "Тип начисления пени". Диалоговое окно АР-12',
@Rationale=N'В соответствии с изменением бизнес-правила',
@CreatedOn='2014-12-18 00:00:00',
@CurentVersion=N'2.1',
@ImplementationVersion=N'2.2',
@State=0,
@Priority=1,
@Stability=1,
@Type=0

【问题讨论】:

  • 您使用哪种 RDBMS? Sql 服务器?
  • 在 SQL Server 中,我无法重现您的情况。除了在您的触发器中,您正在更新整个表。
  • 你的查询有大问题update [Requirement] set Stability = 2这行会更新表中的所有数据而不仅仅是更新的行
  • 如何更新没有更新整个表的表列?
  • 你应该使用这个句子update [Requirement] set Stability = 2 where id in (select id from inserted)(假设你的表有id字段)

标签: sql sql-server tsql database-trigger


【解决方案1】:

好的,如果您仅在更新定义时需要更新需求,则将触发器更改为:

    CREATE TRIGGER [ChangeStabilityRequirement]
    ON [dbo].[Requirement] AFTER UPDATE
    AS
    BEGIN
        if update([Definition]) AND NOT update([Rationale]) AND NOT update([CurentVersion]) 
         --AND NOT UPDATE(.....list here all possible columns that may be updated 
        begin
            update [Requirement] set Stability = 2 
            where RequirementId in (select RequirementId from inserted)
        end
    end 

【讨论】:

  • 现在“稳定性”从未设置 = 2
  • 现在您应该决定是仅在定义更改时更新稳定性,还是在定义与任何其他列一起更改时更新稳定性。显然稳定性没有改变,因为你没有更新查询,它只更新定义列。
  • 当定义与任何其他列一起更改时:)
  • 那么 IF UPDATE(Definition) 就足够了。这意味着如果(定义改变或定义和其他列改变)
  • 那么为什么当我不更改“定义”字段并修改任何其他字段时触发器会触发?
猜你喜欢
  • 2023-03-31
  • 2017-01-27
  • 1970-01-01
  • 2016-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多