插入,更新触发器

时间:2013-01-01 08:57:21

标签: sql sql-server triggers sql-server-2012

我有一个名为Couple的表格,其中包含以下字段CoupleId, HusbandId , WifeId , StartDate , EndDate

上一个表包含有关couple的信息,CoupleId是主键

HusbandIdWifeId是外键,另一个表名为Person

StartDateEndDate代表男性HusbandId与女性WifeId

结婚的开始/结束日期

在我的问题中我有一个条件,即女性不能同时嫁给两个或两个以上的男性“同步婚姻”

我有以下查询

SELECT
   DISTINCT A.WifeID
FROM
   Couple A
   INNER JOIN Couple B
      ON A.WifeID = B.WifeID
      AND A.HusbandID <> B.HusbandID
      AND A.StartDate < B.EndDate
      AND A.EndDate > B.StartDate;

返回任何同步婚姻的女性“同时与两个或更多男性结婚”

我想写一个触发器,当有人想插入或更新couple时触发 表,我希望这个触发器只允许修改它没有故障信息(例如,如果有人在情侣桌上插入一行,而这一行使妻子#4与两个人同时结婚,这个插入不得完成,因为它在表中输入错误信息

此时有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

您可以在没有触发器的情况下解决此问题。在Couples表中创建这三个键的复合主键,如下所示:

PRIMARY KEY(CoupleId, HusbandId, WifeId)

这将确保每个HusbandId的{​​{1}}和WifeId的唯一性。

以下是这两个表的架构设计演示:

SQL Fiddle Demo.


如果您想使用TRIGGER执行此操作,请尝试以下操作:

coupleId

Updated SQL Fiddle Demo using a trigger

这只是一个示例,如果需要,您必须在CREATE TRIGGER WhenInsertOrUpdate ON Couples INSTEAD OF INSERT, UPDATE AS IF (NOT EXISTS( SELECT c.CoupleId FROM Couples c INNER JOIN Inserted i ON c.HusbandId = i.HusbandId AND c.WifeId = i.WifeId AND c.EndDate IS NULL)) BEGIN INSERT INTO Couples SELECT CoupleId, HusbandId, WifeId, StartDate, Enddate FROM Inserted END ELSE BEGIN --- You can put here an update.. END GO; 块中提供更新声明。