2009-09-28 16 views
5

Ho un po 'di puzzle (almeno per me) che spero sia soprattutto perché non sono ancora un master SQL dell'universo. Fondamentalmente Ho tre tabelle:Evita il puntatore del database in SQL Server

tabella A, Tabella B, e C. Tabella

Tabella C ha un FK (Foriegn Key) della tabella B, che ha FK alla Tabella A. (Ciascuno di questi è molte a)

Ho bisogno di rimuovere una voce dalla Tabella A e naturalmente tutte le voci corrispondenti dalle tabelle B e C. In passato ho usato un cursore per fare ciò, selezionando tutte le voci nella Tabella B e ciclicamente attraverso ciascuno di essi per cancellare tutte le voci corrispondenti nella Tabella C. Ora funziona - e ha funzionato bene, ma sospetto/spero che ci sia un modo migliore per ottenere questo effetto senza l'uso di cursori. Questa è la mia domanda: come posso farlo senza usare un cursore o può essere fatto?

(Per favore fatemi sapere se non sono stato chiaro - proverò a sistemare la domanda).

risposta

11

dichiarare le FOREIGN KEY s come ON DELETE CASCADE

+3

@ OP- questo elimina tutti i record nelle tabelle B e C quando un record di riferimento viene eliminato nella Tabella A –

2

Quando si crea la relazione di chiave esterna per entrambe le tabelle è possibile specificare ON DELETE CASCADE e si prenderà cura di questo per voi quando si elimina un record in A.

8

Si potrebbe fare questo un paio di modi ...

CREATE TABLE TableB 
    (FKColumn INT, 
    CONSTRAINT MyFk FOREIGN KEY (FKColumn) 
     REFERENCES TableA(PKColumn) ON DELETE CASCADE) 
  • Si potrebbe utilizzare eliminare trigger su ogni tavolo per eliminare i record correlati.

CREATE TRIGGER cascade_triggerA 
    ON TableA 
    FOR DELETE 
AS 
BEGIN 

    DELETE TableB 
    FROM TableB JOIN DELETED ON TableB.FKColumn = DELETED.PKColumn 

END 

CREATE TRIGGER cascade_triggerB 
    ON TableB 
    FOR DELETE 
AS 
BEGIN 

    DELETE TableC 
    FROM TableC JOIN DELETED ON TableC.FKColumn = DELETED.PKColumn 

END 
  • Se si sta utilizzando MS SQL Server, è possibile utilizzare anche INSTEAD OF DELETE trigger. In questo caso, devi creare il trigger solo su TableA e nel trigger inserire tutta la logica per eliminare i record da tutte e 3 le tabelle.

In uno dei casi sopra descritti, basta eliminare il record dalla tabella A e lasciare che il collegamento a cascata e i trigger si occupino del resto.

5

Le risposte già fornite (eliminazioni a cascata e trigger) sono eccezionali, ma è possibile lavorare in un ambiente in cui queste non sono un'opzione. Se è così, di seguito è una soluzione puramente SQL. L'esempio riguarda esclusivamente la sintassi DELETE. Nel mondo reale probabilmente lo si avvolgerebbe in una transazione e la si implementasse come una stored procedure.

-- 
DECLARE @Param_PK_TableA int 
SET  @Param_PK_TableA = 1500 


------------------------------- 
-- TABLE C -------------------- 
DELETE TableC 

FROM TableC 

    INNER JOIN TableB 
      ON TableB.TableB_ID = TableC.TableB_ID 

    INNER JOIN TableA 
      ON TableA.TableA_ID = TableB.TableA_ID 

WHERE 
    (TableA.TableA_ID = @Param_PK_TableA) 



------------------------------- 
-- TABLE B -------------------- 
DELETE TableB 

FROM TableB 

    INNER JOIN TableA 
      ON TableA.TableA_ID = TableB.TableA_ID 

WHERE 
    (TableA.TableA_ID = @Param_PK_TableA) 



------------------------------- 
-- TABLE A -------------------- 
DELETE TableA 

WHERE 
    (TableA.TableA_ID = @Param_PK_TableA) 
Problemi correlati