2011-02-16 19 views
19

Howdy, Tengo un problema donde necesito una cascada en varias claves externas que apuntan a la misma mesa ..MS SQL "ON DELETE CASCADE" ¿teclas externas múltiples que apuntan a la misma tabla?

[Insights] 
| ID | Title  | 
| 1 | Monty Python | 
| 2 | Spamalot  | 

[BroaderInsights_Insights] 
| broaderinsight_id | insight_id | 
| 1     | 2   | 

Básicamente, cuando sea grabar uno o dos en los puntos de vista tabla se elimina necesito la relación de también se suprime ..

he intentado esto:

CREATE TABLE broader_insights_insights(id INT NOT NULL IDENTITY(1,1), 
    broader_insight_id INT NOT NULL REFERENCES insights(id) ON DELETE CASCADE, 
    insight_id INT NOT NULL REFERENCES insights(id) ON DELETE CASCADE, 
    PRIMARY KEY(id)) 
Go 

esto da lugar a la advertencia de que la cascada "puede causar ciclos o camino cascada múltiple"

Así que he intentado añadir una cascada que sólo el insight_id y esto se traduce en:

"La instrucción DELETE en conflicto con la restricción REFERENCIA"

¿Alguna idea?

Gracias

Daniel

+1

Tal eliminación en cascada rara vez es una buena idea. Piensa en lo que sucedería si también tienes "Vida de Brian" allí. Elimine LoB y elimine las cascadas para matar a Monty Python, que conecta en cascada para eliminar Spamalot. Como se trata de una relación circular, al eliminar cualquier miembro del círculo, se elimina todo el círculo. –

+1

¿Estoy confundiendo las cascadas? pensé que el concepto era cuando el registro referenciado se eliminó la relación también se elimina? ¿Cómo sugerirías lograr esto? –

+0

Debe realizar las eliminaciones en una transacción (lo más fácil es un proceso almacenado) en lugar de a través de eliminaciones en cascada. – HLGEM

Respuesta

26

que tendrá que aplicar esto como una EN LUGAR DE desencadenador de eliminación en el entendimiento, para conseguir que funcione. Algo así como:

create trigger T_Insights_D 
on Insights 
instead of delete 
as 
    set nocount on 
    delete from broader_insights_insights 
    where insight_id in (select ID from deleted) or 
    broader_insight_id in (select ID from deleted) 

    delete from Insights where ID in (select ID from deleted) 

frecuentes con eliminaciones en cascada y un montón de claves externas, lo necesario para pasar tiempo para elaborar una orden de "cascada", por lo que la eliminación que se produce en la parte superior de un "árbol" se conecta en cascada con éxito a las tablas de referencia. Pero eso no es posible en este caso.

+2

Crackalacking, gracias :) –

Cuestiones relacionadas