Ich würde vermutlich wg Komplexität und Performance die erste Variante nehmen. Defacto mache ich das in ähnlichen Szenarien. Ob da ein
not null oder so dabei ist, geschenkt. Sollte mit den gängigen
db per Constraint statusabhängig abzusichern sein.
Trigger finde ich intransparent, am besten nur für ID oder so.
Vielleicht hilft es, update, insert, delete zu unterbinden und statt dessen nur eine SP zu erlauben / nutzen, die die Operationen (Statuswechsel/Lifecycle) ermöglicht.
Todsicher wird es, wenn niemand als AppOwner/Schema User Daten verarbeitet, so dass die Berechtigung auf Update/Insert/Delete versus SP voll greift.
P.S.: In einer Mehrschichtanwendung kannst Du den Zugriff auf die SP sowieso vorgeben.