J'ai une application php où j'exécute une procédure stockée contenant un package DTS (SQL Server). J'ai réussis à faire démarrer ce package DTS avec xp_cmdshell. Pour lancer le tout, j'utilise la commande suivante :
Mon problème : L'importation des tables prend un temps fou et je n'aimerais pas que ma page "plante" à cause d'un time out... Y a-t-il une solution plus "user friendly" ???
Non..... Ce n'est pas une solution... Le package DTS va prendre des heures à rouler (plusieurs millions de lignes de données à importer d'une BD Oracle à SQL Server).
Lorsque chaque table effectue son importation, deux fichiers textes sont générés (table_debut.txt au début de l'importation et table_fin.txt à la fin de l'importation). Je veux rafraichir la page à tous les 30 secondes pour vérifier quel fichier a été créé et ainsi afficher un "Table importée avec succès" après chaque importation de tables.
Pour faire cela, il faut que la page soit complètement lue, donc que la store proc roule en background et que le résultat ne soit pas directement dépendant de la page.
Est-ce qu'appeller une store proc qui appelle ma store proc générale ferait la job ?? Est-ce que ma 1ere store proc va attendre le résultat de la 2e pour compléter l'affichage de la page php ?
Je passe dans ce topic un peu comme un cheveu sur la soupe en ne connaissant pas vraiment le sujet (en même temps, j'ai envie de me coucher un peu moins bête ce soir ), mais tu ne pourrais pas "découper" l'importation de chaque table par tronçons, ce qui rendrait PHP moins "sensible" au timeout avec une page qui rapporterait non pas "table importée avec succès", mais plutôt un truc du genre "enregistrements x à y de la table machin importés avec succès" ?
Effectivement.. Le calcul du timeout se faisant entre le moment où la requête est lancée et le moment où la page résultante est affichée, c'est un peu plus complexe que je ne l'imaginais sans trop connaître..
Ou alors, une bidouille dans le genre homme des cavernes : un traitement par lots de 1000 enregistrements, la page résultante qui s'affiche et un JavaScript qui quelque secondes après relance tout seul la suite du traitement par une URL que le traitement précédent à généré.. Basique, pas professionnel et pas non plus très fiable, mais bon.. Je crois surtout que je vais continuer à suivre ce topic : il m'intéresse, en serait-ce que pour ma culture personnelle ..
1) SQL Server -> Management -> SQL Server Agent -> Jobs
Vous devez créer une nouvelle Job avec, dans l'onglet Steps, votre commande "xp_cmdshell" que vous voulez exécuter. Dans mon cas, mon code ressemblait à ceci (sans, pour l'exemple, les username/password):
exec master.dbo.xp_cmdshell 'C:\Progra~1\Micros~3\80\Tools\Binn\ISQL.EXE -S MyServer -U MyUserName -P MyPassword -Q "ISQL_Batch ''My Package and variables''" -n -d MyDataSource'
J'ai appellé ma nouvelle Job: Run_DTS_Packages
2) Vous devez créer une Stored Procedure pour appeller cette Job:
CREATE PROCEDURE Call_DTS_Packages AS
SET NOCOUNT ON
EXEC msdb.dbo.sp_start_job @job_name = 'Run_DTS_Packages', @server_name = 'MyServer'
GO
3) Pour les adeptes de PHP, voici l'appel de la fonction :
$DTS_result = $dbj->Execute(mssql_query("EXECUTE Call_DTS_Packages" ));
Et voilà !!!
J'espère que ce tranfert de connaissance vous aidera dans votre traval ;o)))
Moi non plus je n'en ai pas l'utilité, mais ne connaissant quasiment rien dans ce domaine des BDDs (surtout MS SQL), la soluce m'aura au moins éclairé sur ce qu'il est possible de faire, du moins sur le principe (et même si je connais un peu la technique des jobs en Unix)..
Donc merci de l'avoir postée et surtout détaillée ..