2009-09-10 6 views
1

J'ai une table, département, avec plusieurs champs de bits pour indiquer les types de service One est Entrepôt (lorsqu'il est vrai, indique le département est entrepôt)contrainte de vérification sur la table recherche

Et j'ai une autre table, ManagersForWarehouses avec suivant Structure:

ID autoinc 
WarehouseID int (foreign key reference DepartmentID from departments) 
ManagerID int (foreign key reference EmployeeID from employees) 
StartDate 
EndDate 

pour définir le nouveau directeur pour l'entrepôt, je peux insérer dans ce tableau avec null EndDate, et j'ai un déclencheur qui fixe EndDate pour l'enregistrement précédent pour cet entrepôt = StartDate pour le nouveau gestionnaire, donc un seul gestionnaire apparaît pour un entrepôt à un certain moment.

Je veux ajouter deux contraintes de contrôle comme suit, mais ne savez pas comment faire

  1. ne permettent pas d'insérer dans ManagersForWarehouses si WarehouseID est pas marqué comme entrepôt
  2. Ne laissez pas de décocher l'entrepôt s'il y a des enregistrements dans ManagersForWarehouses

Merci

+0

"2.Ne permet pas de décocher l'entrepôt s'il y a des enregistrements dans ManagersForWarehouses" - voulez-vous dire ceci ou s'il y a des enregistrements actifs (vous avez des dates de fin est pourquoi j'ai demandé) – HLGEM

+0

@HLGEM - Je veux dire, si je déjà défini un ManagerForWarehouse, pour ne pas me permettre de définir le champ de l'entrepôt (bit) de 1 à 0 – bzamfir

Répondre

1
  1. Dans le tableau Départements, ajoutez une contrainte unique (DepartmentID, IsWarehouse)
  2. Dans le tableau de ManagersForWarehouses, ajoutez la colonne IsWarehouse et une contrainte CHECK appliquer que IsWarehouse = 'Y'
  3. Dans le tableau de ManagersForWarehouses, ajouter un FK sur (WarehouseID, IsWarehouse) se référant aux départements (DepartmentID, IsWarehouse) et avec la clause ON UPDATE CASCADE.

Et vous êtes tous ensemble avec 100% d'intégrité solide de roche, sans aucune échappatoire. Seules les contraintes de confiance n'ont aucune échappatoire. Les déclencheurs sont moins fiables.

+0

Merci pour votre idée. – bzamfir

-1

ne pas mettre ce genre de contraintes sur la table DB.
Il est préférable d'appliquer une telle chose en utilisant du code (logique métier).

EDIT: Non lié à votre question, mais vous ne devez pas utiliser le déclencheur pour effectuer des mises à jour sur d'autres lignes. Je n'ai pas de liens solides pour le sauvegarder.

+1

non, il doit être dans la base de données ou l'intégrité des données sera perdue! C'est exactement le genre de chose qui doit être appliquée au niveau de la base de données. – HLGEM

+0

@HLGem: Vous voulez expliquer pourquoi? et comment ce type spécifique de contrainte peut-il être appliqué? – shahkalpesh

+0

Si la contrainte prend en charge l'intégrité des données, vous pouvez uniquement ajouter la contrainte ONCE à votre base de données au lieu de la coder partout où vous en avez besoin. – supertopi

0

Vous devez utiliser un déclencheur pour cela. Un sur chaque table. Assurez-vous de comptabiliser plusieurs insertions, mises à jour ou suppressions d'enregistrements. Faire autre chose mettrait vos données en danger. Les données n'entrent PAS dans les bases de données uniquement à partir d'applications. Vous ne pouvez pas vous permettre d'appliquer ce genre de chose à partir de l'application, sauf si vous voulez des données incorrectes et inutiles.

+0

@HLGEM: Comment les données entrent-elles dans la base de données? Vous avez raison, s'il y a un mouvement de données dans DB à partir de sources autres que l'application. – shahkalpesh

+0

Oui, je sais que je devrais utiliser des déclencheurs, mais je ne sais pas comment ces déclencheurs devraient ressembler.Je suis plus un développeur d'applications et moins un gars de la DB, donc je ne connais pas Tsql aussi bien. Mais je pourrais le gérer avec quelques directions. Merci – bzamfir

+1

pourquoi utiliser des déclencheurs quand il est si facile à implémenter avec des contraintes? –

Questions connexes