|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | |||||
![]() Inscription : février 2003 Messages : 1 109 ![]() |
Bonjour à tous.
Je m'essaye à écrire une proc stockée sur Sybase ASE 11.9 (je sais, ce n'est plus maintenu !!) La voici. C'est une proc qui renvoie des valeurs qui servent pour les clés primaires numériques Lorsque je l'execute via transact SQL je suis déconnecté et j'ai une méchante erreur dans le log de Sybase: 941 - Illegal database context operation Comment faire pour la résoudre? J'ai essayé la solution proposé ici mais rien à faire. Merci de votre aide. Abel Erreur obtenue (extrait log du serveur) Citation:
Code :
Code :
|
|||||
|
|
00
|
|
|
#2 |
![]() ![]() |
Bonjour,
Je viens de répondre sur les forums Sybase, mais je peux reposter ici... Le problème vient à priori du "execute immediate" qui n'est disponible qu'à partir de la version 12. De plus la syntaxe correcte serait: où les parenthèses sont obligatoire pour indiquer que @sqlCommand ne contient pas le nom d'une proc stockée ou d'une RPC. Michael
__________________
Michael Peppler Membre de TeamSybase - www.teamsybase.com "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson |
|
|
00
|
|
|
#3 | |
![]() Inscription : février 2003 Messages : 1 109 ![]() |
Si ça ne vous dérange pas on peut continuer ici? Citation:
|
|
|
|
00
|
|
|
#4 |
![]() Inscription : février 2003 Messages : 1 109 ![]() |
|
|
|
00
|
|
|
#5 |
![]() ![]() |
C'était exactement ce que j'allais suggérer...
Michael
__________________
Michael Peppler Membre de TeamSybase - www.teamsybase.com "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson |
|
|
00
|
|
|
#6 | |
![]() ![]() |
Citation:
__________________
Sr DBA Oracle / Sybase / MS-SQL / DB2 / Informix / Postgresql Administrateur SAP Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums ! |
|
|
|
00
|
|
|
#7 | ||||
![]() Inscription : février 2003 Messages : 1 109 ![]() |
Re, j'ai mis résolu trop vite.
J'ai suivi à la lettre les indications du site sypron J'ai configuré mon serveur pour CIS avec les deux scripts et cela a fonctionné. Par contre quand j'éxecute ma proc, il me dit qu'il ne trouve pas la table ref_counters. (REquête INSERT INTO ref_counters .. dans ma proc plus haut) Qui existe bel et bien. J'ai fait quelques test et j'ai vu que ça marche quand je prefixe la table par le nom de la base de données. J'arrive à le faire pour le insert. Comme ça Code :
Code :
Merci |
||||
|
|
00
|
|
|
#8 |
![]() Inscription : février 2003 Messages : 1 109 ![]() |
Merci de ne pas tenir compte de mon dernier message. Je vais prefixer le nom de la base en dur directement dans les requêtes car la proc est un objet d'une seule base ... @+ |
|
|
00
|
|
|
#9 | ||||
![]() Inscription : février 2003 Messages : 1 109 ![]() |
Re bonjour,
Alors j'ai essayer d'utiliser ma nouvelle proc stock avec la gestion du Exec contourné avec les Remote IO. (Sybase 11.9.2) ça ne marche pas. Le code suivant bloque et je n'ai plus la main. (Je dois tuer l'application pour reprendre la main) Code :
ID=1 Programme = SQL_Advantage Commande= EXECUTE Login=sa Etat = remote i/o Je n'ai rien dans les logs. Une idée? Devrais je avoir un service annexe Sybase qui tourne? Qu'est ce que c'est qu'un XP server par exemple? Dans mes logs j'ai toujours un 'XP Server is not running' lors de l'arrêt du serveur. JE remet le code de la proc stock ici Code :
|
||||
|
|
00
|
|
|
#10 |
![]() ![]() |
Le XP server permet d'exécuter une command OS ou du code C ad-hoc comme une proc stockée. Ce module n'est donc pas en cause ici.
Je suspecte qu'il y a peut-être un problème de logique au niveau des transactions avec l'appel imbriqué de l'insert via sp_remote_sql. Il faut savoir que cet appel ne peut pas être fait dans le contexte de la transaction en cours, et si la requete qui est exécutée par sp_remote_sql doit accèder à une table qui est bloquée par la transaction démarrée dans la proc stpr_get_counter alors elle risque de tout bloquer. Pour vérifier il suffit d'ouvirir une connexion supplémentaire et de faire un sp_who. Si le process est bloqué en "lock sleep" alors cela confirmerait cette analyse. Michael
__________________
Michael Peppler Membre de TeamSybase - www.teamsybase.com "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson |
|
|
00
|
|
|
#11 |
![]() Inscription : février 2003 Messages : 1 109 ![]() |
Effectivement c'est le cas.
Quand j'enlève le niveau d'isolation maximum Code :
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
Le problème c'est que cette procedure sera très probablement sollicitée par plusieurs processus différents et de manière simultanée souhaitant obtenir la même valeur de compteur. Comment faire dans ce cas pour garantir l'intégrité du compteur retourné? (pas de doublons) Merci de votre aide en tout cas. |
|
|
00
|
|
|
#12 | ||
![]() ![]() |
On pourrait imaginer créer une table annexe pour controler l'accès. Cette table n'aurait qu'un enregistrement qui serait mis à jour (sans commit) en entrant dans la proc. Cela devrait permettre de serialiser l'accès.
Par example: Code :
Michael
__________________
Michael Peppler Membre de TeamSybase - www.teamsybase.com "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson |
||
|
|
00
|
|
|
#13 | ||
![]() Inscription : février 2003 Messages : 1 109 ![]() |
mmh ..
Je suis désolé mais là je crois que mes limites sur le Transact SQL sont atteintes. La simple présence d'un update suffira à sérialiser l'accès? Car j'ai déjà un update dans le code de la proc. Ou bien il faut en plus que je vérifie à la fin de la proc que le spid présent dans la table semaphore est bien celui de la connection en cours, et si ce n'est pas le cas recommencer le traitement (ce qui implique une boucle et ne me plait pas trop car ça peut partir théoriquement à l'infini) Un truc comme ça ? Par ailleurs au lieu de creer une table je rajouterai plutot une colonne spid à la table ref_counters Code :
|
||
|
|
00
|
|
|
#14 |
![]() ![]() |
L'idée est de créer un verrou au début de l'accès à la proc. Avec une table avec un seul row le verrou posé par un UPDATE sera un EX_TABLE (exclusif sur la table). Comme l'accès suivant veut faire le même verrou il devra attendre que le précedant execute le COMMIT (ce qui libère le verrou).
L'idée est évidemment d'éviter un verrou sur la table ref_counters, puisque cette table doit être accèdée par l'appel à sp_remote_sql, ce qui se fait via une autre connexion, et donc dans un contexte transactionel différent. Si notre proc pose un verrou sur ref_counters alors l'appel à sp_remote_sql pour faire une mise à jour de ref_counters va bloquer (comme on a vu avec l'utilisation du SET TRANSACTION LEVEL...) Donc on crée un verrou dans une autre table (la donnée qu'on met dans cette autre table importe peu) pour arriver au comportement souhaité. C'est évidemment assez tordu, mais comme on essaie de faire de l'EXECUTE IMMEDIATE quand cette fonctionalité n'existe pas vraiment il faut trouver des moyens détournés... Michael
__________________
Michael Peppler Membre de TeamSybase - www.teamsybase.com "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson |
|
|
00
|
|
|
#15 |
![]() Inscription : février 2003 Messages : 1 109 ![]() |
Merci beaucoup c'est clair et cohérent..
Et cela semble fonctionner ... pour l'instant ;-) Encore merci |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com