2010-04-19 2 views
3

Je souhaite ajouter un type de contrainte de logique métier à une table, mais je ne sais pas comment/où.Comment dois-je faire cela (logique métier) dans Sql Server? Une contrainte?

J'ai une table avec les champs suivants.

  • ID ENTIER IDENTITÉ
  • HubId ENTIER
  • CategoryId ENTIER
  • BIT IsFeatured
  • Foo NVARCHAR (200)

etc.

donc ce que je veux est que vous ne pouvez avoir qu'un thingy en vedette, par hubId + categoryId.

eg. 
1, 1, 1, 1, 'blah' -- Ok. 
2, 1, 2, 1, 'more blah' -- Also Ok 
3, 1, 1, 1, 'aaa' -- constraint error 
4, 1, 1, 0, 'asdasdad' -- Ok. 
5, 1, 1, 0, 'bbbb' -- Ok. 

etc. 

de sorte que la troisième rangée à insérer échouerait parce que ce moyeu et catégorie ont déjà thingy en vedette.

Est-ce possible?

+0

duplicata possible de http: // stackoverflow.com/questions/2587151/combining-the-unique-and-check-constraints – gbn

Répondre

3

Vous utilisez une contrainte de base de données pour protéger les données. Pour moi, la logique métier est calcul ou logique complexe ou ligne par ligne de traitement: non une saveur de contrainte unique

Dans ce cas:

  1. vous pouvez utiliser un déclencheur pour vérifier après l'insertion
  2. définir une vue indexée filtrage IsFeatured = 1 à HubId sur, CategoryId, IsFeatured
  3. utiliser un filtered index parce que vous avez SQL Server 2008 (qui est similaire à une vue indexée)

J'irais pour l'option 3, personnellement

PS: où est l'articleID que vous avez mentionné?

Et cette question: Combining the UNIQUE and CHECK constraints

Edit:

Fondamentalement, vous feriez

CREATE UNIQUE INDEX IX_Foo ON Mytable (HubId, CategoryId) WHERE IsFeatured = 1 

Donc, l'unicité est maintenant vérifiée sur (HubId, CategoryId) ne pour le sous-ensemble de données où IsFeatured = 1

+0

articleId était une erreur. Je l'ai réparé, ci-dessus. Donc .. un index filtré .. cela semble intéressant ... brb (lit à ce sujet) .. hmmm. Je pense que ma tête a juste sauté. Pouvez-vous élaborer sur l'index filtré? par exemple. S'agit-il d'un «sous-ensemble de données» ou d'une «donnée hétérogène»? Je me sens tellement stupide :( –

+0

.. et parce que c'est un index, j'ai encore besoin d'avoir le déclencheur AFTER insert (et mise à jour), non? (Et l'index accélère seulement la requête de sélection, dans le déclencheur) –

+0

.. et qu'en est-il de l'utilisation d'une contrainte de vérification + un index filtré?(Je pensais que les contraintes de vérification devraient être utilisées sur les triggers, si possible) –

Questions connexes