最初の部分では、デフォルトの制約を追加するだけです:
alter table patient add constraint df_status default 'Registered' for status
フロントエンドが挿入でステータスを省略したり、値を DEFAULT に設定したりできないため、これでは不十分な場合は、トリガーを作成できます。
create trigger PatientInsertTrigger on patient
after insert
as
-- trigger should not alter @@rowcount
set nocount on
update patient
set status = 'Registered'
from Patient
-- Inserted is a pseudotable holding newly inserted rows
-- This is how we know what records to update
inner join Inserted
on Patient.ID = Inserted.ID
レコードが診断に追加または削除された場合、患者のステータスは、診断で一致するレコードの数に従って更新する必要があります。幸いなことに、トリガーが呼び出された時点でレコードはすでにテーブルにあるため、どちらの場合も count() を使用するだけで十分です。
create trigger DiagnosisTrigger on diagnosis
after insert, delete
as
set nocount on
update patient
set status = case when d.NumberOfDiagnosis <> 0
then 'Diagnosed'
else 'Registered'
end
from Patient
inner join
(
select PatientID, count(*) NumberOfDiagnosis
from Diagnosis
-- Get all patients with added or removed diagnosis
where PatientID in (select PatientID
from Inserted
union
select PatientID
-- Pseudotable holding removed records
from Deleted)
group by PatientID
) d
on Patient.ID = d.PatientID
ステータスは StatusID である必要がありますが、適切な ID 番号について言及していません。