OVH Cloud OVH Cloud

Pb : Sous requêtes non prises en charge dans les containtes CHECK ?

4 réponses
Avatar
News Groups
Bonjour à tous,

Je suis sous SQL Server 2000.
Je désire, dans une table, affecter à certaines de mes colonnes des
contraintes CHECK comportant des sous requêtes de type SELECT
..FROM..etc..faisant appel à d'autres colonnes de ma table ou d'autres
tables, Or le message suivant apparait à l'execution : "Les sous-requêtes ne
sont pas pris en charge par les contraintes CHECK..".
Donc, comment puis-je décrire des contraintes sur colonnes faisant
intervenir d'autres colonnes de la table ou d'autres tables de ma base ?
De même comment décrire une contrainte verticale c'est à dire, une
contrainte qui, pour valider, la valeur saisie, fait appel à des valeurs
déjà saisie dans les autres enregistrements de ma table; exemple : sur une
colonne MONTANT, la valeur possible ne doit pas être supérieure à la valeur
maxi de tous les montants déjà saisis dans les lignes précédantes ?

Merci de vos réponses.

Thierry.

4 réponses

Avatar
Michel Walsh
Salut,


Jet le permet, mais pas MS SQL Server. Avec MS SQL Server, il faut
passer par des Triggers, car sous MS SQL Server, les CHECK ne sont permis
qu'au niveau du champ, ou au niveau de l'enregistrement, pas au niveaux des
tables (ou entre enregistrements différents de la même table).


Espérant être utile,
Vanderghast, Access MVP

"News Groups" wrote in message
news:3f9cf850$0$233$
Bonjour à tous,

Je suis sous SQL Server 2000.
Je désire, dans une table, affecter à certaines de mes colonnes des
contraintes CHECK comportant des sous requêtes de type SELECT
..FROM..etc..faisant appel à d'autres colonnes de ma table ou d'autres
tables, Or le message suivant apparait à l'execution : "Les sous-requêtes


ne
sont pas pris en charge par les contraintes CHECK..".
Donc, comment puis-je décrire des contraintes sur colonnes faisant
intervenir d'autres colonnes de la table ou d'autres tables de ma base ?
De même comment décrire une contrainte verticale c'est à dire, une
contrainte qui, pour valider, la valeur saisie, fait appel à des valeurs
déjà saisie dans les autres enregistrements de ma table; exemple : sur une
colonne MONTANT, la valeur possible ne doit pas être supérieure à la


valeur
maxi de tous les montants déjà saisis dans les lignes précédantes ?

Merci de vos réponses.

Thierry.




Avatar
News Groups
Merci de tes conseils,
Je pense effectivement que l'ensembles des contraintes liées à la logique
métier de l'application sont apparemment à implémenter par des triggers.
Par contre, je ne savais pas que Jet permet d'utiliser ce type de contraite
(hormis la déclaration des CONSTRAINT pour les intégrités référentielles),
peux tu m'en donner une syntaxe ou me diriger vers une source traitant de
cela.

Merci.
Thierry

"Michel Walsh" a écrit dans le message
de news:
Salut,


Jet le permet, mais pas MS SQL Server. Avec MS SQL Server, il faut
passer par des Triggers, car sous MS SQL Server, les CHECK ne sont permis
qu'au niveau du champ, ou au niveau de l'enregistrement, pas au niveaux


des
tables (ou entre enregistrements différents de la même table).


Espérant être utile,
Vanderghast, Access MVP

"News Groups" wrote in message
news:3f9cf850$0$233$
> Bonjour à tous,
>
> Je suis sous SQL Server 2000.
> Je désire, dans une table, affecter à certaines de mes colonnes des
> contraintes CHECK comportant des sous requêtes de type SELECT
> ..FROM..etc..faisant appel à d'autres colonnes de ma table ou d'autres
> tables, Or le message suivant apparait à l'execution : "Les


sous-requêtes
ne
> sont pas pris en charge par les contraintes CHECK..".
> Donc, comment puis-je décrire des contraintes sur colonnes faisant
> intervenir d'autres colonnes de la table ou d'autres tables de ma base ?
> De même comment décrire une contrainte verticale c'est à dire, une
> contrainte qui, pour valider, la valeur saisie, fait appel à des valeurs
> déjà saisie dans les autres enregistrements de ma table; exemple : sur


une
> colonne MONTANT, la valeur possible ne doit pas être supérieure à la
valeur
> maxi de tous les montants déjà saisis dans les lignes précédantes ?
>
> Merci de vos réponses.
>
> Thierry.
>
>




Avatar
Michel Walsh
Salut,


Certainement. Ainsi, pour une contrainte qui ne premettrait pas plus
qu'on enregistre plus de 4 joueurs par équipe:


CurrentProject.Connection.Execute "ALTER TABLE PlayersTeams ADD
CONSTRAINT PasPlusDeQuatreParEquipe CHECK( 4>=(SELECT COUNT(*) FROM
PlayersTeams As a WHERE a.TeamID=TeamID) ) ;"

Puisque je refère à la table elle-même, je dois utiliser un alias
( AS a ) et par défaut, les champs non-qualifiés par une table ( TeamID dans
a.TeamID=TeamID) refère à l'enregistrement actuellement ajouté/modifié
(mais non effacé car un CHECK n'est pas 'vérifié' si l'enregistrement est
effacé, seulement si il y a ajout ou modification).



Il FAUT passer par ADO, car DAO ne reconnaît pas cette extension de
JET 4.0. On ne peut PAS passer par le designeur de requête (qui est basé
sur DAO dans un point-mdb). On peut donc ajouter cette contrainte à partir
de la fenêtre d'exécution immédiate (ou dans du code VBA).


Bien sûr, CHECK peut également être appliqué sur un contrainte de
champ ou sur une contrainte (abusivement dite) de table, tout comme en MS
SQL Server.


Access Developers' Handbook, chez Sybex mentionne cette syntaxe
(depuis Access 2000, il va de soi, puisqu'on parle d'une extension de Jet
4.0) avec un exemple impliquant une quantité à sortir devant être inférieure
ou égale à une quantité en stock. Il n'y a pas d'interface utilisateur qui
permet de "voir" ces contraintes (emmagasinées dans MSysObjets, colonne
Connect). L'énoncé du CHECK( ... ) ne peut PAS contenir d'énonocé VBA (zut,
ç'aurait été un hack pour avoir un trigger VBA! ).



Espérant être utile,
Vanderghast, Access MVP



"News Groups" wrote in message
news:3f9d379d$0$231$
Merci de tes conseils,
Je pense effectivement que l'ensembles des contraintes liées à la logique
métier de l'application sont apparemment à implémenter par des triggers.
Par contre, je ne savais pas que Jet permet d'utiliser ce type de


contraite
(hormis la déclaration des CONSTRAINT pour les intégrités référentielles),
peux tu m'en donner une syntaxe ou me diriger vers une source traitant de
cela.

Merci.
Thierry

"Michel Walsh" a écrit dans le


message
de news:
> Salut,
>
>
> Jet le permet, mais pas MS SQL Server. Avec MS SQL Server, il


faut
> passer par des Triggers, car sous MS SQL Server, les CHECK ne sont


permis
> qu'au niveau du champ, ou au niveau de l'enregistrement, pas au niveaux
des
> tables (ou entre enregistrements différents de la même table).
>
>
> Espérant être utile,
> Vanderghast, Access MVP
>
> "News Groups" wrote in message
> news:3f9cf850$0$233$
> > Bonjour à tous,
> >
> > Je suis sous SQL Server 2000.
> > Je désire, dans une table, affecter à certaines de mes colonnes des
> > contraintes CHECK comportant des sous requêtes de type SELECT
> > ..FROM..etc..faisant appel à d'autres colonnes de ma table ou d'autres
> > tables, Or le message suivant apparait à l'execution : "Les
sous-requêtes
> ne
> > sont pas pris en charge par les contraintes CHECK..".
> > Donc, comment puis-je décrire des contraintes sur colonnes faisant
> > intervenir d'autres colonnes de la table ou d'autres tables de ma base


?
> > De même comment décrire une contrainte verticale c'est à dire, une
> > contrainte qui, pour valider, la valeur saisie, fait appel à des


valeurs
> > déjà saisie dans les autres enregistrements de ma table; exemple : sur
une
> > colonne MONTANT, la valeur possible ne doit pas être supérieure à la
> valeur
> > maxi de tous les montants déjà saisis dans les lignes précédantes ?
> >
> > Merci de vos réponses.
> >
> > Thierry.
> >
> >
>
>




Avatar
Michel Walsh
Salut,


Remarquer que je n'ai jamais essayé d'utiliser CHECK avec une fonction, à
l'intérieur du CHECK, sous MS SQL Server 2000. Si cela fonctionne, sous la
fonction, on peut alors peut-être simuler le même genre de chose? sans
passer par des triggers.


Vanderghast, Access MVP


"Michel Walsh" wrote in message
news:
Salut,


Certainement. Ainsi, pour une contrainte qui ne premettrait pas plus
qu'on enregistre plus de 4 joueurs par équipe:


CurrentProject.Connection.Execute "ALTER TABLE PlayersTeams ADD
CONSTRAINT PasPlusDeQuatreParEquipe CHECK( 4>=(SELECT COUNT(*) FROM
PlayersTeams As a WHERE a.TeamID=TeamID) ) ;"

Puisque je refère à la table elle-même, je dois utiliser un alias
( AS a ) et par défaut, les champs non-qualifiés par une table ( TeamID


dans
a.TeamID=TeamID) refère à l'enregistrement actuellement ajouté/modifié
(mais non effacé car un CHECK n'est pas 'vérifié' si l'enregistrement est
effacé, seulement si il y a ajout ou modification).



Il FAUT passer par ADO, car DAO ne reconnaît pas cette extension


de
JET 4.0. On ne peut PAS passer par le designeur de requête (qui est basé
sur DAO dans un point-mdb). On peut donc ajouter cette contrainte à partir
de la fenêtre d'exécution immédiate (ou dans du code VBA).


Bien sûr, CHECK peut également être appliqué sur un contrainte de
champ ou sur une contrainte (abusivement dite) de table, tout comme en MS
SQL Server.


Access Developers' Handbook, chez Sybex mentionne cette syntaxe
(depuis Access 2000, il va de soi, puisqu'on parle d'une extension de Jet
4.0) avec un exemple impliquant une quantité à sortir devant être


inférieure
ou égale à une quantité en stock. Il n'y a pas d'interface utilisateur qui
permet de "voir" ces contraintes (emmagasinées dans MSysObjets, colonne
Connect). L'énoncé du CHECK( ... ) ne peut PAS contenir d'énonocé VBA


(zut,
ç'aurait été un hack pour avoir un trigger VBA! ).



Espérant être utile,
Vanderghast, Access MVP



"News Groups" wrote in message
news:3f9d379d$0$231$
> Merci de tes conseils,
> Je pense effectivement que l'ensembles des contraintes liées à la


logique
> métier de l'application sont apparemment à implémenter par des triggers.
> Par contre, je ne savais pas que Jet permet d'utiliser ce type de
contraite
> (hormis la déclaration des CONSTRAINT pour les intégrités


référentielles),
> peux tu m'en donner une syntaxe ou me diriger vers une source traitant


de
> cela.
>
> Merci.
> Thierry
>
> "Michel Walsh" a écrit dans le
message
> de news:
> > Salut,
> >
> >
> > Jet le permet, mais pas MS SQL Server. Avec MS SQL Server, il
faut
> > passer par des Triggers, car sous MS SQL Server, les CHECK ne sont
permis
> > qu'au niveau du champ, ou au niveau de l'enregistrement, pas au


niveaux
> des
> > tables (ou entre enregistrements différents de la même table).
> >
> >
> > Espérant être utile,
> > Vanderghast, Access MVP