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 :

Appel d'une proc. stockée à partir d'un SQL Server 2008 vers un autre


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations forums :
    Inscription : Avril 2010
    Messages : 34
    Points : 23
    Points
    23
    Par défaut Appel d'une proc. stockée à partir d'un SQL Server 2008 vers un autre
    Bonjour,

    J'essaie d'appeler une procédure stockée présente sur un serveur SQL 2008 (Serveur_A) depuis un autre serveur SQL 2008 (Serveur_B), mais SQL Server me retourne une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec Serveur_A.MaBDD.MaTable param1, param2, ...
    Résultat :
    Le fournisseur OLE DB "SQLNCLI10" du serveur lié "Serveur_A" a retourné le message "Spécification d'autorisation non valide".
    Msg 7399, Niveau 16, État 1, Ligne 1
    Le fournisseur OLE DB "SQLNCLI10" du serveur lié "Serveur_A" a rapporté une erreur. Échec de l'authentification.
    Msg 7303, Niveau 16, État 1, Ligne 1
    Impossible d'initialiser l'objet de la source de données du fournisseur OLE DB "SQLNCLI10" du serveur lié "Serveur_A".
    J'ai mis le RPC à true sur chaque base, et les 2 bases sont en 64 Bits et en SP1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    exec sp_linkedservers
    me retourne :

    Serveur_A | SQLNCLI | SQL Server | Serveur_A | NULL | NULL | NULL
    Serveur_B | SQLNCLI | SQL Server | Serveur_B | NULL | NULL | NULL
    Bref si quelqu'un voit la source du problème...

    Merci et bonne journée

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations forums :
    Inscription : Avril 2010
    Messages : 34
    Points : 23
    Points
    23
    Par défaut
    J'ai réussi à corriger l'erreur en passant par un nouveau linkedserver :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    exec sp_addlinkedserver
    'serveur_A_LS',
    '',
    'SQLNCLI10',
    'serveur_A'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec sp_serveroption serveur_A_LS, 'rpc', true
    L'appel à ma procédure stockée directement marche bien, mais quand je fais cet appel dans un déclencheur, j'obtiens cette erreur :
    Le partenaire du gestionnaire de transactions a désactivé la prise en charge des transactions à distance/par réseau.

  3. #3
    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 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Un trigger encapsule une transaction. Vous devez donc démarrer la transaction en mode DISTRIBUTED et active le service DTC sur l'ensemble des serveurs afin de faire du commit à deux phases.

    Personnellement je ne ferais jamais d'appel de procédure distante dans un trigger sauf si vous voulez sciemment pourrir les performances de votre application !

    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/ * * * * *

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations forums :
    Inscription : Avril 2010
    Messages : 34
    Points : 23
    Points
    23
    Par défaut
    Merci pour ta réponse, ca marche niquel maintenant !

    Qu'est ce que tu veux dire par
    Citation Envoyé par SQLpro Voir le message
    Personnellement je ne ferais jamais d'appel de procédure distante dans un trigger sauf si vous voulez sciemment pourrir les performances de votre application !
    ?

    Le déclencheur serait activé environ 10 fois par jour, ca risque de tout faire planter sur les 2 serveurs ?

  5. #5
    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 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Pour les performances c'est catastrophique car dans une transaction il y a maintient des verrous sur les tables. Hors le code dans un trigger est à l'intérieur de la transactions implicite (INSERT, UPDATE ou DELETE)
    Par conséquent vous allez allonger les temps de verrouillage par les allers et retours entre vos deux serveurs... Et là c'est généralement multiplier par 1000 la durée de la transaction, qui bloque tous les autres utilisateurs. Un peu comme si vous voulez faire manœuvrer une paquebot à un carrefour prévu pour des smart !
    Bref, il faut éviter les triggers et dans le cas ou il n'y a pas d'autres solution (ce qui est rare) il faut en minimiser la durée le plus possible.
    Or votre solution va à l'inverse....

    Pourquoi ne pas faire cela directement dans une procédure stockée ?

    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/ * * * * *

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations forums :
    Inscription : Avril 2010
    Messages : 34
    Points : 23
    Points
    23
    Par défaut
    Ah ouais en effet c'est moche.

    Du coup la solution est de mettre cette proc stock sur le serveur du déclencheur pour qu'il n'y ait pas d'appel distant dans celui-ci.

    De toute façon, l'action de la proc stock n'est pas énorme, elle est exécutée rapidement dans ce cas là.


    Bref, merci pour ton aide, je mets le sujet en résolu

    Ciao

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 08/09/2010, 17h25
  2. Réponses: 3
    Dernier message: 23/04/2009, 09h24
  3. Réponses: 7
    Dernier message: 25/10/2008, 17h49
  4. Appels de procedures stockées dans une proc stockée ?
    Par Nadaa dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 17/07/2008, 10h32
  5. Réponses: 3
    Dernier message: 10/04/2007, 13h53

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