2010-10-06 10 views
2

Je crée un site Web sur lequel les utilisateurs peuvent publier des messages, puis les utilisateurs peuvent ajouter des commentaires à ces articles. J'ai une base de données avec 3 tables. L'un contient des informations sur l'utilisateur, l'autre contient des informations de publication et la dernière contient des informations sur les commentaires.SQL Server en cascade

Je souhaite définir des règles de sorte que si un utilisateur est supprimé, tous ses messages et commentaires sont supprimés et si l'utilisateur supprime l'un de ses messages, tous les commentaires associés sont supprimés. Cela configure cependant les «chemins multiples CASCADE».

Je cherchais une solution et trouvé des informations sur les déclencheurs. Seraient-ils la meilleure chose à utiliser? Si je les utilisais, devrais-je changer toutes les CASCADES à faire par des déclencheurs?

Merci

Clivest

Répondre

0

Une autre option serait de créer deux dédiés procédures stockées qui feraient ces supprimer les étapes au besoin

CREATE PROCEDURE dbo.DeleteUser @UserID VARCHAR(50) 
AS BEGIN 
    DELETE FROM dbo.Comments 
    WHERE Author = @UserID 

    DELETE FROM dbo.Posts 
    WHERE Author = @UserID 

    DELETE FROM dbo.User 
    WHERE UserID = @UserID 
END 

et pour la deuxième règle:

CREATE PROCEDURE dbo.DeletePost @PostID INT 
AS BEGIN 
    DELETE FROM dbo.Comments 
    WHERE PostID = @PostID 

    DELETE FROM dbo.Posts 
    WHERE ID = @PostID 
END 

Dans ce cas, vous avez le contrôle total Sur ce qui se passe réellement, il n'y a pas de surprises inattendues provenant des suppressions en cascade, et pas besoin non plus d'utiliser des déclencheurs.

+0

C'est ce que je cherchais. – Clivest

0

Je pense que cela peut être installé assez facilement, sans l'erreur que vous rencontrez, et sans l'utilisation des déclencheurs, comme suit:

1) The foreign key between Users and Posts should be set up to be cascade delete 
2) The foreign key between Posts and Comments should be set up to be cascade delete 
+0

Merci pour la réponse. J'ai considéré ceci, mais que se passe-t-il si un utilisateur, autre que celui qui a créé le poste, commente. Si leur compte est supprimé alors votre solution ne supprimerait pas leur commentaire – Clivest

2

utilisation déclarative intégrité référentielle . La suppression d'une ligne de foo effacera toutes les lignes liées dans la barre.

create table foo 
(
    id int   not null primary key , 
    foo varchar(32) not null , 
) 
create table bar 
(
    id  int not null primary key , 
    foo_id int  null foreign key references foo (id) on delete cascade , 
) 

Soyez prudent avec les suppressions en cascade, bien que - graisser une instruction delete peut causer beaucoup de dégâts très rapidement, pas très différent de rm (1) in * nix. Les suppressions en cascade peuvent également mastiquer votre journal de transactions assez rapidement, si vous supprimez beaucoup de données d'un seul coup.

+0

Merci pour la réponse. Je suis un débutant SQL. Est-ce possible de configurer dans l'option 'Relations ...' sur SQL Server Management Studios? – Clivest

+0

Lorsque vous définissez des contraintes de clé étrangère dans SQL Server Management Studio, vous pouvez sélectionner les actions référentielles à effectuer lorsque la valeur de clé primaire associée est supprimée ou mise à jour (mais vous devez écrire DDL (instructions CREATE/ALTER Au lieu de cela, il est beaucoup plus simple de faire en sorte que votre schéma soit sous contrôle de source [b] –

Questions connexes