INSERT上的SQL触发器和带有2个表的DELETE

Shr*_*r S 2 sql triggers sql-server-2008

我有两张叫做病人和诊断的桌子.如下

Patient        Diagnosis
---------      ------------
ID (PK)        ID (PK) 
Name           PatientID (FK: Reference to Patient => ID)
Status 
******          *****
----------     -----------

在此,患者状态可以[ 注册,诊断OnCourse ]

中,

  • 新患者插入,患者状态将被注册
  • 新诊断插入,将诊断患者状态

现在,在 诊断删除时,我需要检查如果患者在诊断表中至少有一个诊断条目,那么患者状态将被诊断,否则注册

那么,如何在单触发器中完成所有这些条件?

请帮我.

Mat*_*lie 5

触发根据诊断表上的INSERT和DELETE更新Patient.Status.

CREATE TRIGGER dbo.Diagnosis_TrgInsDel
  ON  dbo.Diagnosis
  AFTER DELETE, INSERT
AS 
BEGIN

    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;


    -- Change the Status to 'Registered' after the last
    -- Diagnosis record is deleted
    --------------------------------------------------------------------------------
    UPDATE
      Patient
    SET
      [Status] = 'Registered'
    FROM
      Patient
    INNER JOIN
      Deleted
        ON Deleted.PatientID = Patient.ID
    WHERE
      NOT EXISTS (SELECT * FROM Diagnosis WHERE PatientID = Deleted.PatientID)


    -- Change the Status to 'Diagnosed' after an Insert and the
    -- current Status is 'Registered'
    --------------------------------------------------------------------------------
    UPDATE
      Patient
    SET
      [Status] = 'Diagnosed'
    FROM
      Patient
    INNER JOIN
      Inserted
        ON Inserted.PatientID = Patient.ID
    WHERE
      Patient.[Status] = 'Registered'

END
Run Code Online (Sandbox Code Playgroud)

我实际上已经把这个作为两个触发器.一个为AFTER DELETE一个为一个AFTER INSERT.这意味着当存在INSERT时DELETE代码不会运行,反之亦然.但上面的代码确实可以正常工作.

编辑

由Nikola发现; 如果在同一操作中为同一患者插入或更新多个诊断,则可能会多次更新单个患者记录.这些修改应解决这个问题......

    UPDATE
      Patient
    SET
      [Status] = 'Registered'
    WHERE
      NOT EXISTS (SELECT * FROM Diagnosis WHERE PatientID = Patient.ID)
      AND EXISTS (SELECT * FROM Deleted   WHERE PatientID = Patient.ID)
Run Code Online (Sandbox Code Playgroud)

和...

    UPDATE
      Patient
    SET
      [Status] = 'Diagnosed'
    WHERE
          Patient.[Status] = 'Registered'
      AND EXISTS (SELECT * FROM Inserted WHERE PatientID = Patient.ID)
Run Code Online (Sandbox Code Playgroud)