Estrictamente hablando, la única forma de poner en cascada valores como ese es usando ON UPDATE CASCADE. Para hacer eso , la columna "is_deleted" tiene que ser parte de una restricción única.
Eso por sí solo no es demasiado difícil. Si company.id es su clave principal, entonces el par de columnas {id, is_deleted} también será único. Una restricción única en ese par de columnas le permitiría realizar actualizaciones en cascada a través de una referencia de clave externa.
Pero eso no funcionará en tu caso, porque necesita permitir que los valores de referencia sean diferentes de los valores referenciados.
Entonces, en tu caso, creo que tienes tres opciones.
- Disparadores
- Procedimientos almacenados
- Código de aplicación
En todos esos casos, debe prestar atención a los permisos (probablemente revocar los permisos de eliminación) y a los casos que pueden evitar su código. Por ejemplo, la interfaz de línea de comandos y la interfaz GUI de dbms se pueden usar para sortear las restricciones en el código de la aplicación y, según los permisos, en los procedimientos almacenados.