Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/03/2011, 12h19   #1
Invité de passage
 
Développeur informatique
Inscription : avril 2009
Messages : 9
Détails du profil
Informations personnelles :
Âge : 21
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2009
Messages : 9
Points : 1
Points : 1
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 !
j.gaiotto est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 15h12   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 16h40   #3
Invité de passage
 
Développeur informatique
Inscription : avril 2009
Messages : 9
Détails du profil
Informations personnelles :
Âge : 21
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2009
Messages : 9
Points : 1
Points : 1
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
j.gaiotto est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 17h02   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 17h23   #5
Invité de passage
 
Développeur informatique
Inscription : avril 2009
Messages : 9
Détails du profil
Informations personnelles :
Âge : 21
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2009
Messages : 9
Points : 1
Points : 1
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 !
j.gaiotto est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 17h46   #6
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
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 :
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 :
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 :
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
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 * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 18h01   #7
Invité de passage
 
Développeur informatique
Inscription : avril 2009
Messages : 9
Détails du profil
Informations personnelles :
Âge : 21
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2009
Messages : 9
Points : 1
Points : 1
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...
j.gaiotto est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 18h41   #8
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
Code :
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...
Citation:
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.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h50.


 
 
 
 
Partenaires

Hébergement Web