|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Développeur informatique Inscription : avril 2009 Messages : 9 ![]() |
Bonjour, j'ai un problème avec un appel de procédure stockée sur un serveur distant.
J'ai 2 serveurs, srv-web et srv-sqlx64, ayant MS SQL SERVER installé sur chacun d'eux. Je développe une application web (en .NET) située sur srv-web, mais ma base se situe sur srv-sqlx64 (pas très pratique mais les ordres sont les ordres...). Lorsque l'on fait une insertion dans la table d'une base de srv-sqlx64, je voudrai créer un dossier dans srv-web. Je suis donc obliger de créer une procédure stockée sur srv-web, de le lier à srv-sqlx64, et d'appeler ma procédure avec un trigger after insert (parce que xp_create_subdir ne gère pas les chemins UNC...) Donc le problème en lui-même est que si je me met dans srv-sqlx64 et que j'appelle ma procédure avec une requête, ca fonctionne très bien, mon dossier se crée dans srv-web. Mais quand j'insère des données dans la table, c'est le trigger qui s'en charge et là le message d'erreur est le suivant : "L'opération n'a pas pu être effectuée, car le fournisseur OLE DB SQLNCLI du serveur lié srv-web n'a pas réussi à démarrer une transaction distribuée. Le founisseur OLE DB SQLNCLI du serveur lié srv-web a retourné le message 'Le gestionnaire de transactions a désactivé sa prise en charge de transaction à distance/réseau'" Pourtant dans les propriétés du serveur lié, j'ai bien mis Rpc et Sortie Rpc à true... Please help ! Merci d'avance ! |
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour
et pour une fois cet ordre est empli de bon sens. Il est tout à fait adéquat, pour des raisons de sécurité et surtout de performances, d'avoir le serveur de base de données sur une machine distincte du serveur web.Ce que je ne comprend pas, c'est pourquoi avoir quand même une instance de SQL Server sur le serveur Web ? et ce que je ne comprend pas non plus, c'est pourquoi imputer au serveur de base de données le soin de créer des répertoires sur le serveur web ? surtout quand c'est appelé par un trigger Une petite explication sur le pourquoi du comment serait la bienvenue car je pense qu'en continuant sur cette voie, vous vous exposez à tout un tas de problèmes par la suite... 1/ Quel est le rôle de la table en question ? 2/ qui insère dedans et comment ? 3/ quel est le rôle des répertoires sur le serveur de base de données ? |
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Développeur informatique Inscription : avril 2009 Messages : 9 ![]() |
En fait, on héberge toutes nos applications web sur srv-web, ainsi que leurs bases associées, qui ne sont pas très grosses.
L'autre serveur, srv-sqlx64 n'héberge que peu de bases, qui sont bien plus conséquentes. Cette fois on m'a dit d'héberger l'application sur srv-web, mais sa base sur srv-sqlx64. Et je ne suis qu'un développeur. Donc je ne pose pas de questions =p Voici le contexte de l'application : -les utilisateurs créent des clients ou des chantiers dans l'application -ils effectuent des visites chez le client ou sur le chantier -ils se rendent dans la fiche client, et rédigent un compte rendu de visite. Dans ce compte rendu, il doit être possible d'ajouter des pièces jointes type pdf, doc, ou jpg. Je voudrai donc stocker toutes les pièces jointes dans un dossier "uploads" de l'application (donc sur srv-web). Mais pour ne pas tout mélanger, je me suis dit qu'il vaudrait mieux créer un dossier par chantier / par client (type "chantier<Identifiant>" ou "client<identifiant>") et uploader les pièces jointes à l'intérieur. Du coup, pour ne pas le faire dans le code de l'application, j'ai pensé le faire avec un trigger after insert. Le problème est que srv-sqlx64 n'a pas le droit de créer un répertoire sur srv-web, puisque la commande pour cela ne gère pas les chemins UNC. Donc sur srv-web j'ai écrit la procédure stockée qui crée les dossiers, puis j'ai lié srv-web à srv-sqlx64, et finalement j'appelle la procédure depuis un trigger de srv-sqlx64. Mais j'ai ce message d'erreur... Alors oui forcément à expliquer par écrit ça fait un peu lourd... Donc pour synthétiser je vais répondre aux 3 questions : 1/ La table stocke les clients ou les chantiers 2/ Les utilisateurs créent ces clients ou chantiers 3/ Les dossiers devraient servir à organiser les fichiers joints aux comptes rendus de visite. Exemple (pour finir) : -je crée mon client "Test" -il a 42 pour id automatique dans la table Clients -after insert, je crée le dossier "client42" dans le dossier upload de l'application -je vais dans la fiche client de "Test" et j'y poste un compte rendu de visite en y ajoutant un pdf que le client m'a donné. Ce pdf devrait s'uploader dans le dossier "client42". Je ne sais pas si j'ai été assez clair ou trop confus... Merci |
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
très clair.
Mais pourquoi ne voulez vous pas le faire dans le code de l'application. Cela serait pourtant plus son rôle que le SGBDR (et à mon sens beaucoup plus simple) : Au moment de la création de votre client/chantier, si la requête réussi, vous récupérez l'ID du client/chantier créé, et vous créez le répertoire depuis .Net. ou sinon, au moment du premier upload pour un client/chantier, vous créez le répertoire s'il n'existe pas. Mais faire créer par le SGBDR un repertoire, sur un serveur distant, au sein d'une transaction... ![]() Et je ne parle même pas des problème de droits...
|
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Développeur informatique Inscription : avril 2009 Messages : 9 ![]() |
Pour le problème de droits ça ira, j'emprunte une identité, avec un compte exprès pour ça.
C'est juste que j'ai développé un peu comme une m*rde : il y a la liste des clients, avec un bouton "nouveau" ; jusque là rien de plus normal. Mais à droite à gauche dans l'application, l'utilisateur a la possibilité de créer un client à la volée (merci le web 2.0) lorsqu'il se rend compte qu'il n'est pas présent dans la liste. Et au lieu de centraliser le code dans un seul fichier, j'ai le même code un peu partout... Oui j'ai honte ^^ Bon du coup je vais me recogner le code, ça sera plus propre. Merci quand même de vous être intéressé à mon problème ! |
|
|
00
|
|
|
#6 | ||||||
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 953 ![]() |
Une façon de faire plus astucieuse serait de stocker vos fichiers dans le SGBDR à titre de FILESTREAM... Du coup vous pourriez les charger directement en SQL via une fonction
Un petit exemple : Préparation de la base pour réperttoire de stockage des doc : Code :
Code :
Code :
http://mikedavem.developpez.com/tuto...l-server-2008/ A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
||||||
|
00
|
|
|
#7 |
|
Invité de passage
![]() Développeur informatique Inscription : avril 2009 Messages : 9 ![]() |
Ca peut être pas mal comme ça aussi, et d'ailleurs ça serait plus pratique au niveau de la gestion de l'ajout/suppression...
Merci, je reviendrai vers vous si j'ai un soucis ! Edit : Oui mais en fait non. On est en SQL SERVER 2005... |
|
|
00
|
|
|
#8 | ||||
|
Membre Expert
![]() |
Citation:
Citation:
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com