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 :

Confusions sur les permissions d'existence des tables


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Par défaut Confusions sur les permissions d'existence des tables
    Bonjour

    J'avais créer ma procédure stockée sur le serveur de développement et tous marchait bien.

    Lorsque j'ai copié cette procédure stockée sur le serveur des tests rien ne marche plus.

    Il semble que les deux serveurs n'offrent pas les mêmes permissions.

    Dans ma procédure stockée j'avais créer des tables avec into.

    J'ai aussi vérifé l'existence de table avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    IF  NOT EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID('Mabase.dbo.Table_1') AND type IN ('U')) 
      BEGIN
         Print 'Ljhdbjdsbvjhbvfjbvjv' 
      END
    mais ca me donne une réponse que la Table_1 n'existe pas, alors que en réalité la table exite.

    Les deux select suivants suivants donne deux résultats différents. le premier me donne le id et le type alors que le deuxième ne trouve rien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT id, type FROM sysobjects WHERE id = OBJECT_ID('Mabase.dbo.Table_1')
    SELECT id, type FROM Master.dbo.sysobjects WHERE id = OBJECT_ID('Mabase.dbo.Table_1')
    Aussi des fois ca me donne "X" comme type et non "U"

    Y a t-il moyen de remédier à ces confusions ?

    Merci.

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    La fonction OBJECT_ID ne fonctionne que dans le contexte de la base de données actuelle, donc vous ne pouvez pas qualifier le nom de la table par le nom du schéma à laquelle elle appartient, ni par la base de données qui l'héberge.

    Vous pouvez écrire directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    IF EXISTS
    (
    	SELECT *
    	FROM sysobjects
    	WHERE name = 'maTable'	
    )
    BEGIN
    	-- Traitement ...
    END
    @++

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Bonjour,

    La fonction OBJECT_ID ne fonctionne que dans le contexte de la base de données actuelle, donc vous ne pouvez pas qualifier le nom de la table par le nom du schéma à laquelle elle appartient, ni par la base de données qui l'héberge.

    Vous pouvez écrire directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    IF EXISTS
    (
        SELECT *
        FROM sysobjects
        WHERE name = 'maTable'    
    )
    BEGIN
        -- Traitement ...
    END
    @++
    Merci Elsuket je vais l'essayer lundi.
    Est-ce que ca serait possible que ce serveur n'accepte pas la création de table avec la clause " into" mais plutôt des tables temporaires avec précédé par le signe % ou # ?

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Je vous déconseille la création de tables dans vos procédures stockées à l'aide de la clause INTO de l'instruction SELECT.
    Même chose pour les tables temporaires

    @++

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Je vous déconseille la création de tables dans vos procédures stockées à l'aide de la clause INTO de l'instruction SELECT.
    Même chose pour les tables temporaires

    @++
    Ma procédure stockée est exécutée par une job la nuit et elle s'exécute une fois par jour.

    Dans ce cas, devrais-je créer mes tables temporaires moi même et les effacer à la fin de la procédure stockée ou bien utiliser des tables temporaires du systèmes qui seront effaçées automatiquement.

    tables temporaires
    SQL Server permet de stocker dans des variables table ou des tables temporaires (locales à la session ou globales à l'instance) des données.
    Puis laquelle dois-je utilisée ? locale à la session ou bien globales à l'instance ?

    Merci.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Par défaut
    Citation Envoyé par DEV-10 Voir le message
    Merci Elsuket je vais l'essayer lundi.
    Est-ce que ca serait possible que ce serveur n'accepte pas la création de table avec la clause " into" mais plutôt des tables temporaires avec précédé par le signe % ou # ?
    Je viens de l'essayer comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT *
        FROM sysobjects
        WHERE name = 'maTable'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT *
        FROM sysobjects
        WHERE name = 'maBase.dbo.maTable'
    Ca marche lorsque dans l'analyseur de requête je suis insatllé sur la bases de données où se trouve matable.

    Mais ca ne marche pas lorsque je suis installé sur une autre bases de données.

    Mais puisque ma procédure stockée fait appel à des tables dans différentes bases de données comment faut-il faire pour tester l'existence des tables dans plusieurs bases données ?

    Merci.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Par défaut
    Citation Envoyé par DEV-10 Voir le message
    Je viens de l'essayer comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT *
        FROM sysobjects
        WHERE name = 'maTable'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT *
        FROM sysobjects
        WHERE name = 'maBase.dbo.maTable'
    Ca marche lorsque dans l'analyseur de requête je suis insatllé sur la bases de données où se trouve matable.

    Mais ca ne marche pas lorsque je suis installé sur une autre bases de données.

    Mais puisque ma procédure stockée fait appel à des tables dans différentes bases de données comment faut-il faire pour tester l'existence des tables dans plusieurs bases données ?

    Merci.
    Je peux rajouter avant chaque test d'existence de table l'énonçé suiavnt
    Mais je ne pense pas que c'est la meilleure solution.

  8. #8
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Tu peux écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM maBase.sys.sysobjects
    WHERE name = 'maTable'
    @++

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

Discussions similaires

  1. boucle sur les dossiers et conacténatenation des tables
    Par Mery_Dau88 dans le forum Macros Access
    Réponses: 0
    Dernier message: 04/09/2014, 10h16
  2. Etablir des modifs sur les permissions sur serveur FREE
    Par dessinateurttuyen dans le forum Outils
    Réponses: 5
    Dernier message: 02/04/2008, 16h46
  3. Conditions sur les champs d'une même table
    Par Pucho dans le forum Modélisation
    Réponses: 10
    Dernier message: 19/10/2007, 17h52
  4. Requete sur les elements d'une même table
    Par jean-marieb dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/10/2007, 14h40
  5. Réponses: 4
    Dernier message: 01/08/2007, 17h22

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