{Oracle} Aide sql Server

Fermé
adme Messages postés 32 Date d'inscription mardi 18 novembre 2008 Statut Membre Dernière intervention 20 septembre 2011 - 21 août 2009 à 23:18
HostOfSeraphim Messages postés 6750 Date d'inscription jeudi 2 février 2006 Statut Contributeur Dernière intervention 31 juillet 2016 - 22 août 2009 à 13:13
Bonjour,
J'ai un petit probleme. Voila j'ai une base appele Banque. dans cette base il y a une table nommee titulaire(numclient,noCompte). )Le probleme c'est ke je veux ke le numero de client ne figure ke 4 fois dans cette table. Aide- moi stp....
A voir également:

2 réponses

Salut

tu ne peux pas contrôler un nombre maxi d'occurrences de valeur avec un trigger : comme la table est "en cours de modification" tu ne peux pas lancer un quelconque comptage sur les données qu'elle contient.
tu es obligé de passer par une procédure qui va compter le nombre d'occurrences pour la valeur reçue et
- générer une exception si le comptage dépasse le seuil que tu fixeras
- insèrera effectivement tes données dans la table
0
HostOfSeraphim Messages postés 6750 Date d'inscription jeudi 2 février 2006 Statut Contributeur Dernière intervention 31 juillet 2016 1 608
21 août 2009 à 23:26
Et un trigger qui se déclenche après l'insertion ? (qui effacerait la dernière insertion en cas de non respect de la règle)

0
Hélas, le trigger ne peut pas avoir bcp de conséquences
le trigger AVANT est souvent utilisé pour vérifier des prérequis et éventuellement déclencher une exception (les prérequis ne sont pas remplis) pour faire échouer la transaction
le trigger APRES est souvent utilisé pour répercuter des modifications ailleurs (cascade, synthèse) mais pas pour déclencher une exception car (il arrive APRES la modification dans la table)
Bien évidemment, les tables en cours de modification dans la transaction ne peuvent supporter aucune requête ni de consultation, encore moins de mise à jour.
0
HostOfSeraphim Messages postés 6750 Date d'inscription jeudi 2 février 2006 Statut Contributeur Dernière intervention 31 juillet 2016 1 608
21 août 2009 à 23:39
Justement, dans ce cas précis, ne pourrait-on pas avoir un trigger qui supprimerait la ligne ajoutée par "erreur" ?

Quoiqu'il en soit, le mieux serait d'intervenir au niveau de l'interface logicielle pour cette règle, avant l'insertion en base.

0
Séquelle > HostOfSeraphim Messages postés 6750 Date d'inscription jeudi 2 février 2006 Statut Contributeur Dernière intervention 31 juillet 2016
22 août 2009 à 00:11
Malheureusement non (en Oracle tout du moins, ailleurs je sais pas)
car pendant que la table est "en cours de modification" on n'a pas le droit de la requêter.
=> on ne peut pas compter le nombre d'occurrences
=> on peut encore moins supprimer quelque chose

on ne peut pas sélectionner des données car Oracle ne le veut pas (et j'ai jamais trop bien compris pourquoi - ni creusé d'ailleurs)
on ne peut pas ajouter, modifier ou supprimer des données car à ce moment là on aurait un serpent qui se mord la queue (insertion déclenche une suppression qui déclenche une insertion etc) et leurs ingé support passeraient leur temps à dispenser des cours de programmation :-(

donc on est obligé de faire avec... et le seul objet Oracle qui permette de contrôler des règles de gestion lors de manipulations de données c'est la procédure ! elle devient alors la seule interface de mise à jour de données de la table en question (on se doit donc alors de supprimer tous les droits de mise à jour à tout le monde, sys y compris)
0
HostOfSeraphim Messages postés 6750 Date d'inscription jeudi 2 février 2006 Statut Contributeur Dernière intervention 31 juillet 2016 1 608 > Séquelle
22 août 2009 à 00:15
Je suppose alors que c'est la même chose avec SQL Server. Quoique le coup du serpent qui se mord la queue, ça serait bien le genre de SQL Server ! (j'ai déjà vu SQL Server aller droit dans le mur (plantage du moteur) en toute conscience, sans alerter l'utilisateur...)

0
Séquelle > HostOfSeraphim Messages postés 6750 Date d'inscription jeudi 2 février 2006 Statut Contributeur Dernière intervention 31 juillet 2016
22 août 2009 à 00:53
J'aime bien être méchant vis à vis de Microsoft mais je connais si peu SQL Server que je n'en dirais pas du mal.
La seule chose qui est vraie est que comme c'est un produit Micorsoft, pas mal de monde se dit que c'est un produit plug and play, simple d'utilisation. Du coup, utilisateurs voire consultants bâclent la mise en œuvre du serveur et ça donne forcément une mauvaise image du produit. Quant aux perfs, je suppose que Microsoft a maintenant rattrapé son retard
0
HostOfSeraphim Messages postés 6750 Date d'inscription jeudi 2 février 2006 Statut Contributeur Dernière intervention 31 juillet 2016 1 608 > Séquelle
22 août 2009 à 13:13
J'avais deux bugs qui m'avaient beaucoup surpris sur SQL Server 2005 :

- Le premier concernait un fichier .sql créé sur SQL Server Management Studio. Je ferme, je double-clique sur le fichier pour qu'il se lance avec SQL Server Management Studio... paf : chemin invalide. Curieux. Je réessaye : même chose. Au 7e essai, ça marche, SQL Server Management Studio accepte enfin de l'ouvrir. Je ferme le fichier, la session Windows, je retente : ça recommence... étrange.

- Le second concernait un déplacement de la base système tempdb, en TSQL (pas avec les outils graphiques). Premier essai, je mets un mauvais chemin vers la nouvelle destination, l'ordre ne passe pas et une erreur m'est retournée : normal, SQL Server ne va quand même pas accepter que les fichiers de la base soient dans un dossier inconnu de l'arborescence système... Second essai, je mets le bon chemin, mais j'omets de préciser les noms des fichiers de la base, je mets juste le chemin ; logiquement, ça ne doit pas passer, puisqu'on demande de remplacer C:\SQL\exemple par C:\SQL\, sans nom de fichier... donc ça n'a rien de cohérent... pourtant SQL Server valide l'ordre. Et évidemment, au redémarrage du moteur, il ne peut pas se lancer puisqu'il ne trouve pas les fichiers de la base tempdb. C'était pourtant prévisible, mais SQL Server m'a laissé aller dans le mur alors qu'il le savait...

0