【发布时间】:2021-04-13 10:38:42
【问题描述】:
试图设置一个触发器,但努力让它按我想要的方式工作,我想用为特定公司记录创建的机会记录来更新字段 oppo_pono 所以 1 家公司可以有多个机会,我想记录为公司创建的主机会的数量,因此为公司创建的第一个主 opp 将设置为 1,依此类推
我在下面设置了触发器,但它使用所有公司的计数设置 oppo_pono,而不是我正在为其创造机会的那个
下面是我的触发器
USE [CRM]
GO
/****** Object: Trigger [dbo].[GeneratePNo] Script Date: 1/7/2021 3:55:27 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[GeneratePNo]
ON [dbo].[Opportunity]
FOR insert
AS
declare @OppPrimary Int
declare @company Int
declare @compid Int
declare @type nvarchar(40)
declare @childopp nchar(1)
declare @pono int
Select @OppPrimary = Oppo_OpportunityId,
@company = Oppo_PrimaryCompanyId,
@compid = comp_companyid,
@type = Oppo_Type,
@childopp = oppo_childoppo,
@pono = oppo_pono
FROM Inserted inner join company on Oppo_PrimaryCompanyId = @compid
Begin
UPDATE [Opportunity] SET oppo_pono = (select count(*) from vSearchListOpportunity where Oppo_Deleted is null and @type = 'Master' and Oppo_PrimaryCompanyId = ) +1
WHERE Oppo_OpportunityId =@OppPrimary
End
【问题讨论】:
-
您的触发器有 MAJOR 缺陷,您似乎认为它会被 每行调用一次 - 事实并非如此。触发器将每条语句触发一次,因此如果您的
INSERT导致此触发器触发插入 25 行,您将触发触发器一次和@987654323 @ 伪表将包含 25 行。您的代码将从Inserted中选择这 25 行中的哪一行?它是不确定的,您将获得任意行,而您将忽略所有其他行。您需要重写触发器以考虑到这一点! -
当机会被删除时会发生什么?然后你是否也重新编号所有其他人?
-
不会真正删除任何主要商机,因为它们会有与其相关联的子商机
标签: sql sql-server tsql triggers