2009-10-19 8 views
1

Je dois écrire une requête pour supprimer la forme 2 tablessupprimer des enregistrements de 2 tables

DELETE FROM [Policies],[BackupSpec] WHERE [PolicyID] = @original_PolicyID 

PloicyID est PK dans les politiques et FK en Backupspec

suggestions ??

SqlConnection conn = new SqlConnection(); 
     conn.ConnectionString = ConfigurationManager.ConnectionStrings["SumooHAgentDBConnectionString"].ConnectionString; 
     string sql = "DELETE FROM [Policies],[BackupSpec] WHERE [PolicyID] = @original_PolicyID"; 
     string sql1 = "DELETE FROM [Backupspec] WHERE [PolicyID] = @original_PolicyID"; 
     SqlCommand cmd = new SqlCommand(sql, conn); 
     SqlCommand cmd1 = new SqlCommand(sql1, conn); 

     cmd.Parameters.AddWithValue("@original_PolicyID", item); 


     conn.Open(); 
     cmd.ExecuteNonQuery(); 
     conn.Close(); 

Répondre

1

Vous ne pouvez pas supprimer de deux tables à la fois. Il s'agit d'une limite de SQl Server et vous n'avez donc pas d'autre choix que d'envoyer deux instructions de suppression ou de définir une suppression en cascade sur l'enregistrement parent. Je recommande les deux instructions plutôt que la suppression en cascade car la suppression en cascade peut entraîner des problèmes de verrouillage si la suppression implique de nombreux enregistrements. Souvenez-vous que cascade delete affecte les suppressions de n'importe quelle source dans les tables impliquées et que même si vous supprimez seulement un enregistrement à la fois, cela prendra également effet si quelqu'un d'autre a besoin de supprimer un million d'enregistrements. Il faudra également de plus en plus de temps et attacher plus de tables que le nombre de tables enfant augmente.

0

Supprimer d'une table à la fois et utiliser des transactions pour le rendre atomique. Ou définissez le FK comme ON DELETE CASCADE et supprimez uniquement de la table parente.

+0

n'est pas là une requête pour le faire .. ?? – user175084

+0

Pas dans SQL Server (il y a un moyen de le faire dans MySQL, par exemple). –

0

La manière la plus simple de le faire est d'avoir 2 requêtes séparées à supprimer des politiques et de la table des spécifications de sauvegarde. La seule raison pour laquelle je ferais ceci est parce que

1) .Il est plus facile pour d'autres personnes de débogage par code pour comprendre ce qui se passe. 2). Le système est généralement géré par une classe de gestionnaires qui facilite la séparation du code.

+0

même si je pense que c'est pareil mais ça n'arrive pas? – user175084

+0

la méthode ci-dessus ne fonctionne pas ... aucune aide – user175084

+0

Vous devez vous assurer que vous supprimez d'abord backupspec, I.E vous supprimez toujours la clé étrangère avant la clé primaire – RC1140

0

Votre code peut fonctionner si vous effectuez d'abord la suppression de Backupspec, puis supprimez de Policies. Le FK vous empêche de supprimer d'abord l'enregistrement Policies (c'est le point de l'intégrité référentielle).

Questions connexes