La más sencilla sería claudicar y dejarle a Clarion que se encargue de estos casos pero nuevamente nos estaríamos atando a él y por otro lado si queremos hacer algo por "afuera" tendríamos que asegurarnos de no dejar ningún cabo suelto (releyendo esto no sé si estoy escribiendo sobre programación o planeando un asesinato).
Dado que queremos dejarle todo el trabajo sucio a SQL la otra alternativa es escribir un par de triggers que se encarguen de todo. En realidad solo necesitaríamos el de borrado porque, como dije antes, el ID del empleado no cambiará pero me estaría contradiciendo con lo de hacer arreglos por afuera. Aún cuando el ID el usuario no lo ve siempre aparece alguien que te dice "ahh, no, empezó a contar desde 0 y yo quería que fuese desde 1.000.000, ¿no lo podés cambiar?".
Empecemos con el Trigger de actualización, que es el que pongo a continuación:
Código: Seleccionar todo
CREATE TRIGGER [dbo].[TR_Empleados_update]
ON [dbo].[Empleados]
AFTER UPDATE
AS
BEGIN
IF UPDATE(EMP_ID)
BEGIN
UPDATE F
SET F.EMP_PADRE=A.NuevoId
FROM [dbo].[EMPLEADOS] F INNER JOIN (
SELECT I.EMP_ID NuevoId,D.EMP_ID ViejoId
FROM INSERTED I
INNER JOIN DELETED D ON I.EMP_ID=D.EMP_ID ) A
ON A.ViejoId=F.EMP_PADRE
END
END
Código: Seleccionar todo
CREATE TRIGGER [dbo].[TR_Empleados_update]
ON [dbo].[Empleados]
AFTER UPDATE
es el nombre del Trigger, en la tabla Empleados y lo importante es que se ejecutará DESPUÉS (After) la actualización. Hay otro tipo de trigger que es INSTEAD OF (en lugar de) que se dispara ante una actualización.
Código: Seleccionar todo
IF UPDATE(EMP_ID)
Código: Seleccionar todo
UPDATE F
SET F.EMP_PADRE=A.NuevoId
FROM [dbo].[EMPLEADOS] F INNER JOIN (
SELECT I.EMP_ID NuevoId,D.EMP_ID ViejoId
FROM INSERTED I
INNER JOIN DELETED D ON I.EMP_ID=D.EMP_ID ) A
ON A.ViejoId=F.EMP_PADRE
Para el borrado, el trigger es el siguiente:
Código: Seleccionar todo
ALTER TRIGGER [dbo].[TR_Empleados_Delete]
ON [dbo].[Empleados]
AFTER DELETE
AS
BEGIN
DELETE F FROM [dbo].[EMPLEADOS] F
INNER JOIN DELETED ON F.EMP_PADRE = DELETED.EMP_ID
END
Para que todo esto funcione es necesario borrar del diagrama la relación recursiva en la tabla empleados, quedando así: