|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() mk TBAménagement Inscription : mars 2011 Messages : 8 ![]() |
Bonjour,
j'ai une table T1 avec 3 attributs ID integer Vocation integer TYPE integer valeurs possible de VOCATION : 1,2,3,4,5 valeurs possibles de TYPE : 1,2,3,4,5,6,7,8 La valeurs de TYPE dépend de la valeur de VOCATION. Exemple: si VOCATION = 1 alors TYPE ne peut être que 2 ou 3 ou 5 ou 7 ou 8. SI vocation = 2 alors TYPE ne peut être que 3 ou 4. etc. j'utilise sqlserver2008 je veux crée une contrainte sur TYPE de façon qu'il n'accepte que les valeurs appropriées à sa vocation. j'ai créé le Trigger suivant mais il n'a rien donné. Code sql :
Commande(s) réussie(s). mais dans la table rien n'a changé. une idée s'il vous plait Merci |
||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour
C'est normal, un trigger se déclenche lorsqu'une des commandes pour lesquelles il a été spécifié est lancée. dans votre cas, le trigger se déclenchera après un INSERT ou un UPDATE De plus, vous déclarez des variables qui ne servent a rien, et qui ne sont pas valuées. votre trigger ne fait donc rien, car la condition n'est jamais avérée. Mais... Que voulez vous faire ? vérifier lors des ordres de manipulation de données que les données insérées ou modifiées sont valides, ou voulez-vous modifier les données présentes dans votre table afin de les valider ? |
|
|
10
|
|
|
#3 |
|
Invité de passage
![]() mk TBAménagement Inscription : mars 2011 Messages : 8 ![]() |
bonjour aieeeuuuuu
Merci pour votre réponse en effet je veux vérifier lors des ordres de manipulation de données que les données insérées ou modifiées sont valides une idée SVP Merci |
|
|
00
|
|
|
#4 | |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
alors, il faut modifier votre trigger pour travailler sur la pseudo table INSERTED, qui contient vos données insérées ou modifiées.
mais que voulez vous faire des données non valides, les corriger, ne pas le inserer de facon silencieuse, ou générer une erreur ? que voulez vous faire également si dans un jeu de données, certaines sont valides et pas d'autres ? Citation:
Comment sont définies votre règles fonctionnelles ? avez vous des tables qui contiennent les valeurs de type acceptées en fonction des valeurs de VOCATION ? |
|
|
|
10
|
|
|
#5 | |||||
|
Invité de passage
![]() mk TBAménagement Inscription : mars 2011 Messages : 8 ![]() |
bonjour aieeeuuuuu
Citation:
Citation:
Citation:
Citation:
Citation:
Merci infiniment |
|||||
|
|
00
|
|
|
#6 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour,
Avec un contrainte check, vous ne pourrez pas de toute façon faire de requete sur la table contenant les valeurs acceptées. C'est donc bien un trigger qu'il vous faut. (Vous pourriez aussi interdire les INSERT/UPDATE sur la table et passer obligatoirement par des procédures stockées qui effectuent les vérifications avant d’insérer les données) voici un exemple pour le trigger. en considerant les regles suivantes : Si a vaut 1, alors b doit valoir 1,2 ou 3 Si a vaut 2, alors b doit valoir 3 ou 4 Code SQL :
Je vous laisse adapter à votre modèle et à vos règles |
||
|
|
00
|
|
|
#7 | ||||||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Bonjour,
On peut tout à fait implémenter une contrainte de domaine (CHECK), mais il fait dans le cas présent l'aide d'une fonction scalaire. On peut faire de même avec les contraintes de valeur par défaut (DEFAULT). Sans table, on peut écrire : Code :
On peut aussi se servir de l'exemple d'aieeeuuuuu, avec la table suivante : Code :
Code :
L'avantage sur le trigger est que la contrainte de domaine est vérifiée en amont, donc la transaction n'est pas exécutée si la règle n'est pas vérifiée. En revanche avec le trigger, on exécute d'abord la transaction, puis on vérifie que les données insérées sont correctes. Dans le cas où elle ne le sont pas, on annule la transaction, ce qui implique un parcours du fichier du journal des transactions en sens inverse de la séquence : c'est donc bien plus long que la vérification de la contrainte de domaine Par ailleurs, le code du trigger tg_T1 n'est pas ensembliste, donc il est faux. @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
||||||
|
10
|
|
|
#8 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
|
|
|
00
|
|
|
#9 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
En fait sans table, on peut même se passer de fonction pour le coup et écrire directement
Code SQL :
mais cela reste plus difficile à maintenir qu'avec une table de règles... |
||
|
|
00
|
|
|
#10 | |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Citation:
Je vois que tu fais un calcul avec a dans la contrainte CHECK, ce que je crois ne pas être possible. Étais-tu en train de penser à une colonne calculée implémentée par une fonction scalaire ? @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
|
00
|
|
|
#11 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Si c'est possible, en plaçant la contrainte au niveau de la table, et non au niveau de la colonne b.
Par contre je ne suis pas très fier de mon ELSE a - 1 pour interdire toutes les autres valeurs. ça serait peut etre plus propre comme ça : Code SQL :
|
||
|
|
00
|
|
|
#12 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Je n'ai pas écrit que ce n'est pas possible
En revanche ton second script pour la contrainte constraint ck_MaTable me semble tout à fait correct. Le premier ne contient pas de prédicat @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
10
|
|
|
#13 | |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Citation:
dans le deuxième, je fais de même, mais d'une autre façon |
|
|
|
10
|
|
|
#14 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Effectivement, donc je prend mon zéro.
'devais être un peu fatigué ![]() @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
10
|
|
|
#15 |
|
Invité de passage
![]() mk TBAménagement Inscription : mars 2011 Messages : 8 ![]() |
bonjour
merci à tous |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com