Vous auriez un système plus flexible si vous implémentiez des groupes plutôt que d'en faire un attribut de la table utilisateur. Cela dit, évidemment, vous pouvez appliquer votre règle de gestion avec un déclencheur.
Il existe toutefois un moyen d'utiliser une contrainte, au moins partiellement.
Créer une table:
AccountAdmin
------------
account_admin_id (pk)
account_id (fk) Add unique constraint
user_id (fk)
Une fois que vous avez l'index unique sur account_id, vous appliquer votre règle selon laquelle il ne peut y avoir qu'un seul administrateur par compte. Lorsque vous créez un utilisateur qui est un administrateur, vous devez insérer une ligne dans AccountAdmin. La contrainte vous empêchera de le faire si un administrateur existe déjà. Cela dit, pour changer d'un administrateur à l'autre, vous devez d'abord supprimer la ligne de cette table, puis ajouter la nouvelle. Une fois que vous commencez à considérer le type de code dont vous avez besoin pour supporter une fonction comme "change admin" ou "promote to admin", les triggers sont encore moins souhaitables à mon avis.
En ce qui concerne Triggers:
Après avoir fait beaucoup de travail sur les systèmes où il y a une exigence que le système soit extensible à « n » utilisateurs, l'une des choses que j'ai appris à éviter est la création les goulets d'étranglement au niveau de la persistance des données. Les déclencheurs MySQL et les procs stockés ne sont pas intrinsèquement extensibles.
Vous concentrez un goulot d'étranglement dans la base de données et vous limitez la concurrence. Il n'y a aucun moyen de faire cet exercice dans un déclencheur sans verrouiller la table pour s'assurer que lorsque vous interrogez pour vous assurer qu'il n'y a pas d'administrateurs pour votre organisation, une autre requête n'insère pas d'administrateur avant vous. C'est aussi un anti-pattern d'avoir à lancer une exception de base de données et à gérer cela, pour quelque chose qui n'est pas une erreur du tout (c'est-à-dire qu'un admin existe déjà).
S'il existe un moyen de déplacer ce code dans l'application (et dans ce cas, c'est le cas), il s'agit d'une solution plus évolutive.
Sans cette table est un déclencheur le seul chemin que j'ai disponible? –
Comment pourriez-vous avoir dépassé le point d'ajouter une table qui relie 2 tables existantes par leurs clés? – gview
C'est juste un exemple. –