2010-09-21 31 views
1

En table A j'ai 2 colonnes:Créer une contrainte T-SQL pour empêcher x nombre d'enregistrements en double dans la table?

ID (int, PK) 
MaxUsers (int) 

En table B j'ai 2 colonnes:

ItemID (int) 
UserID (int) 

Le nombre d'enregistrements dans table A avec correspondance ItemID « s ne peut pas dépasser la valeur MaxUsers.

Est-il possible d'écrire une contrainte de table T-SQL afin qu'il ne soit pas physiquement possible que cela se produise?

À la votre! Curt

+0

Qu'est-ce que vous essayez de résoudre ici? Une entreprise qui dépasse le nombre d'utilisateurs pour lesquels elle a des licences ou quelque chose? –

+0

que feriez-vous alors si quelqu'un a mis à jour le nombre MaxUsers à une limite inférieure? Quels enregistrements de la table B supprimeriez-vous? –

+0

@Lasse - C'est quelque chose de similaire à cela oui, merci. – Curt

Répondre

3

Vous pouvez écrire un déclencheur à l'insertion/à la mise à jour qui effectue une annulation de la requête lorsque les conditions ne sont plus remplies.

+0

cela sonne très bien. Vous aurez besoin du déclencheur INSERT sur la table B et du déclencheur UPDATE sur la table A –

1

Vous pouvez le faire avec des contraintes «vanille», par ex. contraintes au niveau des lignes CHECK, UNIQUE contraintes, FOREIGN KEYS, ce qui le rend très portable, par ex.

CREATE TABLE TableA 
(
ID INTEGER NOT NULL PRIMARY KEY, 
MaxUsers INTEGER NOT NULL CHECK (MaxUsers > 0), 
UNIQUE (ID, MaxUsers) 
); 

CREATE TABLE TableB 
(
ID INTEGER NOT NULL, 
MaxUsers INTEGER NOT NULL, 
FOREIGN KEY (ID, MaxUsers) 
    REFERENCES TableA (ID, MaxUsers), 
ID_occurrence INTEGER NOT NULL, 
CHECK (ID_occurrence BETWEEN 1 AND MaxUsers), 
UNIQUE (ID, ID_occurrence) 
); 

Pour maintenir la séquence ID_occurrence, vous pouvez créer une « aide » proc stocké ou un déclencheur.