IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Problème procédure stockée serveur distant


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Problème procédure stockée serveur distant
    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 !

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    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 ?

  3. #3
    Futur Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    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

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    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... c'est au moins un bon challenge, pour ne pas dire suicidaire

    Et je ne parle même pas des problème de droits...

  5. #5
    Futur Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    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 !

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ALTER DATABASE MaBase
    ADD FILEGROUP FG_DOC CONTAINS FILESTREAM;
     
    ALTER DATABASE MaBase
    ADD FILE
    (NAME = 'REPERTOIRE_DOC',
     FILENAME  = 'C:\DATABASES\FILETREAM\'
    ) TO FILEGROUP FG_DOC;
    Table pur recevoir des fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE T_DOC
    (DOC_ID       INT NOT NULL PRIMARY KEY,
     DOC_NAME     VARCHAR(255),
     DOC_ROWID    UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL UNIQUE DEFAULT NEWID(),
     DOC_BINARY   VARBINARY(max) FILESTREAM);
    insertion d'un fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO T_DOC (DOC_NAME, DOC_BINARYt) 
    SELECT 'Une Image.jpeg'
           D.* 
    FROM OPENROWSET(BULK N'C:\MonImage.jpg', SINGLE_BLOB) AS D
    A lire sur le sujet :
    http://mikedavem.developpez.com/tuto...l-server-2008/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Futur Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    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...

  8. #8
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE T_DOC
    (DOC_ID       INT NOT NULL PRIMARY KEY,
     DOC_NAME     VARCHAR(255),
     DOC_ROWID    UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL UNIQUE DEFAULT NEWID(),
     DOC_BINARY   VARBINARY(max) FILESTREAM);
     
    INSERT INTO T_DOC (DOC_NAME, DOC_BINARYt) 
    SELECT 'Une Image.jpeg'
           D.* 
    FROM OPENROWSET(BULK N'C:\MonImage.jpg', SINGLE_BLOB) AS D
    DOC_ID n'est pas IDENTITY et est NOT NULL l'INSERT ne va pas passer...
    CREATE TABLE T_DOC
    (DOC_ID INT NOT NULL IDENTITY (1,1)PRIMARY KEY,
    DOC_NAME VARCHAR(255),
    DOC_ROWID UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL UNIQUE DEFAULT NEWID(),
    DOC_BINARY VARBINARY(max) FILESTREAM)
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

Discussions similaires

  1. Problème procédure Stockée + VBS
    Par gothard dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 20/02/2007, 16h39
  2. Réponses: 2
    Dernier message: 20/09/2006, 14h38
  3. problème procédure stockée
    Par hamham dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 19/04/2006, 12h33
  4. Problème procédure stockée + trie
    Par an_merle dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 14/02/2006, 22h58
  5. problème de connexion serveur distant
    Par nicoweb371 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 16/12/2005, 11h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo