复制一个数据库表进行更新时(未插入)场异常关键

我创建的触发器为一个表(人)的每个创建一个新的个人条目其ID被插入另一个表(PERSON_ID)的时间,使。 PERSON_ID表只有2行:ID(主键,int和身份)和PERSON_ID(GUID它的值传递与触发)。 这种模式不能因为与我们的业务逻辑其他依赖改变。

现在我需要更新Person表的字段与Person_ID.ID(一旦该人已被自动生成的身份)。 要做到这一点,我创建了一个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)

当我创建一个新的人,我得到以下异常:

Violation of PRIMARY KEY constraint 'TBL_PERSON_A_PK'. Cannot insert duplicate key in object 'dbo.TBL_PERSON_A.

有相关联的表人的更新触发来自传统组件,我无法编辑或看到它(它是加密的)。 看来上述异常的原因。

为什么我得到这个例外,甚至如果我只是进行更新,而不是插入?

要执行更新,然后再次启用它,它就像一个魅力之前解决这个我禁用此类触发:

EXECUTE sp_executesql N'DISABLE TRIGGER dbo.TBL_PERSON_TRU1 ON PERSON' ... EXECUTE sp_executesql N'ENABLE TRIGGER dbo.TBL_PERSON_TRU1 ON PERSON'

然而,我怎么能肯定这不会带来逻辑错误? 谢谢。

--------------解决方案-------------

我不知道这是否会导致您的问题,但你记住,你不停地(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)

除非我误解,你似乎已经回答了你自己的问题; 现在看来,触发你看不到的是做一些,以防更新语句无法完成的定义。

不知道该触发器不会我看不到我们如何能帮助你什么。

作为一个方面说明,我不明白为什么要更新的Person用表IDPerson_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

分类:SQL 时间:2015-03-15 人气:2
本文关键词: SQL,SQL服务器
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.568 (s). 10 q(s)