2011-10-19 3 views
0

J'ai une table ItemComments qui a une colonne avec une contrainte de clé étrangère qui renvoie à une entrée d'élément dans une deuxième table. Je vois cela comme une relation un-à-plusieurs car chaque élément de la deuxième table peut avoir beaucoup de commentaires, mais aucun élément ne peut être associé à la même entrée de commentaire dans la table ItemComments, donc une relation many-to-many ne appliquer.Contraintes SQL Server sur les clés étrangères

PROBLÈME:

Je veux définir une contrainte sur cette colonne qui empêchera la valeur de clé étrangère d'être mis à jour, à savoir que je veux empêcher quiconque de modifier accidentellement l'ID d'élément est associé une entrée de ItemComment spécifique . Je ne suis pas très familier avec le format de l'expression de vérification des contraintes et était curieux de savoir quelle serait la syntaxe pour une telle action. Ou y a-t-il une autre manière plus directe d'accomplir cela? Merci pour l'aide.

MISE À JOUR

Est-il préférable de mettre en œuvre une table de référence croisée comme vous le feriez dans un grand nombre à plusieurs rapports pour faire respecter l'intégrité référentielle de cette façon? Ou est-ce ajouter plus de frais généraux que nécessaire?

Répondre

1

Vous pouvez toujours utiliser un déclencheur. Quelque chose comme:

create trigger dml_PreventUpdate 
on YourTable 
after update 
as 
    if UPDATE(ItemId) 
    rollback 

Il existe deux types de déclencheurs DML (Data Manipulation Language). Il y a un INSTEAD OF puis un déclencheur AFTER/FOR (AFTER et FOR fonctionnent de la même manière). Un déclencheur INSTEAD OF s'exécute, comme son nom l'indique, avant la transaction. Un déclencheur AFTER, comme son nom l'indique, s'exécute après l'action déclenchée. Fondamentalement tout ce déclencheur fait est de tester pour voir si la colonne ItemId est mise à jour à partir de l'instruction UPDATE exécutée contre la table, YourTable. Ce déclencheur se déclenchera à chaque fois qu'il y aura un UPDATE par rapport à YourTable, mais ROLLBACK la transaction si ItemId est un champ mis à jour.

+0

Salut Shark, je dois admettre que je ne suis pas familier avec l'utilisation des déclencheurs, mais cela semble être une option. Je vais lire plus sur le sujet. – kingrichard2005

+0

@ kingrichard2005 J'ai modifié mon message et ajouté une brève explication sur les déclencheurs et ce qui se passe exactement. –

+1

Je vois, ressemble à des déclencheurs sont la voie à suivre. Je vais accepter votre réponse. Merci Shark. – kingrichard2005

Questions connexes