Domanda

Esiste un modo semplice per eliminare un gruppo di tabelle correlate in SQL Server?Idealmente, vorrei evitare di dovermi preoccupare dell'ordine in cui verranno rilasciati poiché so che l'intero gruppo se ne andrà entro la fine del processo.

È stato utile?

Soluzione

A rischio di sembrare stupido, non credo che SQL Server supporti la sintassi delete/cascade.Penso che tu possa configurare una regola di eliminazione per eseguire eliminazioni a cascata (http://msdn.microsoft.com/en-us/library/ms152507.aspx), ma per quanto ne so il trucco con SQL Server è semplicemente eseguire la query di eliminazione una volta per ogni tabella che stai eliminando, quindi verificare che funzioni.

Altri suggerimenti

Un approccio diverso potrebbe essere:prima eliminare i vincoli, poi eliminare le tabelle in un colpo solo.

In altre parole, un DROP CONSTRAINT per ogni vincolo, quindi un DROP TABLE per ogni tabella;a questo punto l'ordine di esecuzione non dovrebbe essere un problema.

Ciò richiede il sp___drop___vincoli script che puoi trovare su Giornale della banca dati:

sp_MSforeachtable @command1="print 'disabling constraints: ?'", @command2="sp_drop_constraints @tablename=?"
GO
sp_MSforeachtable @command1="print 'dropping: ?'", @command2="DROP TABLE ?"
GO

NOTA questo, ovviamente, se intendevi eliminare TUTTE le tabelle nel tuo database, quindi fai attenzione

Non ho accesso a SQL Server per testarlo, ma che ne dici di:

DROP TABLE IF EXISTS table1, table2, table3 CASCADE;

Non sono sicuro che l'approccio di Derek funzioni.Non l'hai ancora contrassegnata come risposta migliore.

Altrimenti:con SQL Server 2005 dovrebbe essere possibile, immagino.
Lì hanno introdotto delle eccezioni (che non ho ancora utilizzato).Quindi rilascia la tabella, rileva l'eccezione, se si verifica una, e prova la tabella successiva finché non sono sparite tutte.
Puoi memorizzare l'elenco delle tabelle in una tabella temporanea e utilizzare un cursore per attraversarla, se lo desideri.

Ho finito per usare Apache ddlutils per eseguire l'eliminazione per me, cosa che ha risolto il problema nel mio caso, anche se una soluzione che funzionasse solo all'interno di SQL Server sarebbe un po' più semplice.

@Derek Park, non sapevo che lì potessi separare le tabelle con virgole, quindi è utile, ma non sembra funzionare come previsto.Sembra che né IF EXISTS né CASCADE siano riconosciuti dal server SQL e siano in esecuzione drop table X, Y, Z sembra funzionare solo se devono essere rilasciati nell'ordine indicato.

Guarda anche http://msdn.microsoft.com/en-us/library/ms173790.aspx, che descrive la sintassi della tabella di rilascio.

Ciò che ti impedisce di eliminare le tabelle in qualsiasi ordine sono le dipendenze di chiave esterna tra le tabelle.Quindi sbarazzati degli FK prima di iniziare.

  1. Utilizzando le visualizzazioni di sistema INFORMAZIONI_SCHEMA, recuperare un elenco di tutte le chiavi esterne correlate a una qualsiasi di queste tabelle
  2. Rilascia ciascuna di queste chiavi esterne
  3. Ora dovresti essere in grado di eliminare tutte le tabelle, utilizzando l'ordine che desideri.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top