Shr*_*r S 2 sql triggers sql-server-2008
我有两张叫做病人和诊断的桌子.如下
Patient Diagnosis --------- ------------ ID (PK) ID (PK) Name PatientID (FK: Reference to Patient => ID) Status ****** ***** ---------- -----------
在此,患者状态可以[ 注册,诊断和OnCourse ]
中,
现在,在 诊断删除时,我需要检查如果患者在诊断表中至少有一个诊断条目,那么患者状态将被诊断,否则注册
那么,如何在单触发器中完成所有这些条件?
请帮我.
触发根据诊断表上的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)
| 归档时间: |
|
| 查看次数: |
8451 次 |
| 最近记录: |