Pregunta

necesito para realizar una ON DELETE CASCADE en mi tabla denominada categoría, que tiene las siguientes columls Cat_id (BIGINT) NOMBRE (VARCHAR) PARENT_CAT_ID (BIGINT)

PARENT_CAT_ID es una FK en cat_id. Obviamente, la hermosa SQL Server no me dejó usar ON DELETE CASCADE reclamando trayectorias circulares o múltiples a su eliminación.

Una solución que a menudo veo propuesto es desencadenantes. Hice el siguiente trigger:

USE [ma]
GO
/****** Object:  Trigger [dbo].[TRG_DELETE_CHILD_CATEGORIES]    Script Date: 11/23/2009 16:47:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[TRG_DELETE_CHILD_CATEGORIES] ON [dbo].[CATEGORY] FOR DELETE AS
SET NOCOUNT ON
/* * CASCADE DELETES TO '[Tbl B]' */
DELETE CATEGORY FROM deleted, CATEGORY WHERE deleted.CAT_ID = CATEGORY.PARENT_CAT_ID

Al eliminar manualmente una categoría con categorías de niños, tengo la siguiente excepción:

excepción

¿Alguna idea de lo que está mal con mi gatillo?

ACTUALIZACIÓN: Lo siento por la edición, pero tengo otro CATEGORY.CAT_SCH_ID columna, que es una FK de otra tabla CAT_SCH.ID. Este FK tiene una eliminación en cascada, así, lo que significa que una vez que elimino una CAT_SCH, también se deben eliminar sus categorías. Por lo tanto, me sale este error cuando defino el gatillo:

No se puede crear LUGAR DE ELIMINAR O en lugar de actualización se activa 'TRG_DEL_CATEGORY_WITH_CHILDREN' en la tabla 'categoría'. Esto se debe a que la tabla tiene una clave externa con cascada Actualizar Borrar o.

¿Alguna idea?

¿Fue útil?

Solución

El PARA desencadenador DELETE se eleva después DELETE original ha sido ejecutado. Para eliminar de forma recursiva, es necesario escribir un desencadenador INSTEAD OF DELETE.

El algoritmo es como sigue:

  • Insertar los PK de borrado en una tabla temporal

  • Para los registros de detalles de registros en la tabla temporal

  • Loop hasta que no se encuentran más registros

registros de eliminación en la tabla al unirse con tabla temporal.

en mi blog .

Actualizar

supongo que sólo tiene que colocar en la bandera que DELETE CASCADE de su clave externa recursiva en Categorías. La bandera CASCADE en la clave externa de CAT_SCH no debería importar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top