我为表(Person)创建了一个触发器,这样每次创建一个新的Person条目时,它的ID都会插入到另一个表(Person_ID)中。 Person_ID表只有2行:ID(主键,int和Identity)和Person_ID(其值与触发器一起传递的GUID)。 由于与业务逻辑的其他依赖性,无法更改此架构。
现在我需要使用Person_ID.ID更新Person表的字段(创建该人后自动生成的标识)。为此,我为Person_ID创建了一个触发器,以便在创建新条目后,生成的ID将更新Person表中的目标字段:
UPDATE Person
SET target_Person = (SELECT JPerson_ID.ID FROM inserted)
WHERE Person.ID IN (SELECT JPerson_ID.PersonID FROM inserted)
当我创建一个新Person时,我得到以下异常:
Violation of PRIMARY KEY constraint 'TBL_PERSON_A_PK'.
Cannot insert duplicate key in object 'dbo.TBL_PERSON_A.
有一个与来自遗留组件的表Person相关联的更新触发器,我无法编辑或查看它(它已加密)。这似乎是上述例外的原因。
即使我只是进行更新而不是插入,为什么会出现此异常?
为了解决这个问题,我在执行更新之前禁用了这样一个触发器,然后再次启用它,它就像一个魅力:
EXECUTE sp_executesql N'DISABLE TRIGGER dbo.TBL_PERSON_TRU1 ON PERSON'
...
EXECUTE sp_executesql N'ENABLE TRIGGER dbo.TBL_PERSON_TRU1 ON PERSON'
但是,我如何确定这不会导致逻辑错误? 感谢。
答案 0 :(得分:1)
我不知道这是否会导致您的问题,但您是否记得您的(SELECT JPerson_ID.ID FROM inserted)
可能会返回多行?
所以插入触发器必须改为有点像:
CREATE TRIGGER [dbo].[trgJPerson_ID] ON [dbo].[TBL_PERSON_A]
FOR INSERT
AS
INSERT INTO dbo.JPerson_ID(ID )
SELECT ID FROM inserted
并相应地删除触发器(如果有的话)
CREATE TRIGGER [dbo].[trgJPerson_ID] ON [dbo].[TBL_PERSON_A]
FOR DELETE
AS
DELETE FROM dbo.JPerson_ID
WHERE ID IN(SELECT ID FROM DELETED)
答案 1 :(得分:0)
除非我误解了,否则你似乎回答了自己的问题;看来你无法看到定义的触发器正在做一些事情来阻止更新语句的完成。
在不知道触发器是什么的情况下,我无法看到我们如何为您提供帮助。
作为旁注,我不明白为什么要使用Person
表中的ID
更新Person_ID
表。这真的有点无意义,因为您可以加入Person_ID
来检索ID
Select p.ID, -- The Person GUID
p.Name,
pi.ID -- The Person_ID ID
From dbo.Person p
Join dbo.Person_ID pi on p.ID = pi.PersonID