SQL à l'aide de déclencheur pour la contrainte
Je suis étudiant les déclencheurs et les contraintes.
Et j'ai une question pour l'utilisation de déclenchement (Pour être honnête, je ne suis pas vraiment sûr de savoir comment utiliser déclencheur..)
Disons que nous avons un des Enseignants de la table.
Et de ce professeur de table contient teacher_id , le ssn , first_name , last_name , class_time
par exemple,
|teacher_id|ssn | first_name | last_name | student_number| max_student
|1 |1234 | bob | Smith | 25 |25
|2 |1235 | kim | Johnson | 24 |21
|3 |1236 | kally | Jones | 23 |22
et
disons-le nombre maximum de numéro d'étudiant sera 25.(nombre maximum d'étudiant sera défini par l'enseignant, de sorte qu'il peut être n'importe quel nombre de 10, 22 , 25...)
et un étudiant qui veut ajouter le bob de la classe. Cependant, je tiens à faire la gâchette que le rejet d'ajouter de l'étudiant.(parce que bob est déjà complet..)
Cependant, je ne suis pas vraiment sûr de la façon de créer de la gâchette .. 🙁 .. (c'est la première fois pour l'étude du déclencheur.... )
N'importe qui peut aider à créer l'exemple de code pour comprendre le déclenchement de la partie?
C'est une règle d'entreprise, dont je me serais attendu à être mis en œuvre dans votre logiciel d'application plutôt que comme un déclencheur ou une contrainte dans la base de données. Base de données des contraintes et des déclencheurs généralement appliquer l'intégrité référentielle (qui est, ils gardent les données de cohérence interne) et même si elle peut éventuellement être un filet de sécurité pour s'assurer que les classes ne vont pas plus de 25, votre application devrait vraiment arrêter de les essayer en premier lieu.
Je suis d'accord la règle doit être appliquée dans chaque application qui utilise la base de données. Je suis en désaccord que c'est l'un ou l'autre ou à la considération. Dans l'idéal, à la fois base de données et d'applications pour l'utilisation d'un seul référentiel de règles; si cela n'est pas possible, alors il devrait être appliquée dans les deux endroits, c'est à dire les applications doivent s'abstenir de la rédaction de mauvaises données par l'intermédiaire de la validation et de la base de données devrait éviter les mauvaises données d'être commis par des contraintes. p.s. Excel est couramment utilisée pour la demande de travailler avec des bases de données (leur donner des privilèges, ils viendront!): comment faites-vous appliquer la règle dans Excel?!
si je comprends bien, le
25
est le nombre maximum d'élèves qui peuvent être inscrits dans Bob de classe. Lors de la 26e étudiant est incorporée dans Bob de classe, puis les données sont incohérentes car la teachers
table indique la taille de la classe ne peut excéder 25
.la définition que vous donnez à 'incompatible' me semble être différente de la définition dans le dictionnaire et non intuitive. Je me demande si vous pouvez fournir une citation? Rappelez-vous que une ligne dans une table de base de données est un prédicat qui est vrai. Une ligne d'une table, que représentent, il est vrai que pas plus de 25 élèves peuvent prendre de Bob en classe. Une ligne dans une autre table peut dire Ravi est le 26 inscrits dans Bob de classe. Les deux ne peut pas être vrai. Comment est-ce pas 'incompatible'?
OriginalL'auteur Dc Redwing | 2012-03-12
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, je pense que c'est une règle de données et, par conséquent, devraient être appliquées de manière centralisée. C'est, il devrait y avoir une contrainte de base de données (ou l'équivalent) appliquée par le SGBD qui empêche toutes les applications pour l'écriture des données de mauvaise qualité (plutôt que de compter sur l'individu codeurs de chaque demande de s'abstenir d'écrire des données de mauvaise qualité).
Deuxième, je pense qu'une
AFTER
déclencheur est approprié (plutôt qu'uneINSTEAD OF
de déclenchement).Troisième, cela peut être appliqué à l'aide de la clé étrangère et et au niveau de la ligne
CHECK
contraintes.Pour une contrainte de type de déclenchement, l'idée générale est d'écrire une requête pour renvoyer des données de mauvaise qualité alors dans le test du déclencheur que ce résultat est vide.
Vous n'avez pas posté de nombreux détails de vos tables, donc je vais essayer de le deviner. Je suppose
student_number
est destiné à être un comptage des élèves; comme il est, il sonne comme un identificateur donc je vais changer le nom et d'assumer l'identificateur pour les étudiants eststudent_id
:Dans SQL Server, la définition du déclencheur ressemblerait à quelque chose comme ceci:
Il y a quelques autres considérations, cependant. L'exécution de cette requête après chaque
UPDATE
de la table peut être très inefficace. Vous devez utiliserUPDATE()
(ouCOLUMNS_UPDATED
si vous pensez que la colonne de commande peut être invoqué) et/ou ladeleted
etinserted
conceptuel tables de limiter la portée de la requête et quand c'est le feu. Vous aurez également besoin de s'assurer que les opérations sont correctement sérialisé pour éviter les problèmes de simultanéité. Bien que la cause, il n'est pas très complexe.Je recommande fortement le livre Mathématiques appliquées à la Base de données des Professionnels de la de la Lex de Haan, Toon Koppelaars, chapitre 11 (les exemples de code sont Oracle, mais peut être facilement porté à SQL Server).
Il peut être possible d'atteindre le même sans les déclencheurs. L'idée est de faire un superkey sur
(teacher_id, students_tally)
pour être référencé dans l'Inscription, pour lequel une séquence unique d'étudiant occurrences seront maintenus avec un test que la séquence ne pourra jamais dépasser le maximum de pointage.Voici quelques os à nu SQL DDL:
Puis ajouter quelques 'aider' stored proc/fonctions pour maintenir la séquence de mise à jour.
OriginalL'auteur onedaywhen