Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
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 04/08/2011, 14h11   #1
Membre à l'essai
 
Inscription : novembre 2009
Messages : 93
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 93
Points : 22
Points : 22
Par défaut Différence entre tab.schema tab@schema

Bonjour à tous.

Je suis actuellement dans la maintenance et le développement d'une appli avec une base Oracle.

Y a des vues et des schémas différents.
En schema j'ai BUDGET_2009, BUDGET_2010, BUDGET_2011
Et des vues...

Pourquoi parfois j'ai par exemple:
Code :
SELECT ... BUDGET_2010.TABLE
Code :
SELECT une_vue_view@BUDGET_2010
Sur une requête j'ai :
Code :
SELECT ... BUDGET_2011.TABLE
Ça me retourne une erreur :
"table or view does not exist" alors que le dblink existe, la vue aussi et que la même requête, exactement la même mais avec le schéma :
Code :
SELECT ... BUDGET_2010.TABLE
fonctionne.
Si je mets pour 2011:
Code :
SELECT ... TABLE@BUDGET_2011
là ça fonctionne...

Bref j'ai du mal à comprendre si quelqu'un pouvait m'éclairer sur la syntaxe entre les vues, schémas, table et les . ou les @ dans quel cas utiliser une forme plutôt que l'autre, je suis preneur

Merci à tous.
Tonii est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 14h56   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
l'expression complète est
Code :
SELECT [NOM DU SCHEMA.]Nom de la table/vue[@DBLINK]
donc quand il y a un @, c'est que tu vas aller chercher sur une autre base

Quand il y a un . c'est que tu vas chercher dans un schéma particulier.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 15h00   #3
Membre à l'essai
 
Inscription : novembre 2009
Messages : 93
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 93
Points : 22
Points : 22
Merci McM j'y vois plus clair

Mais dans ce cas j'ai une autre question.
J'ai donc 2 schemas EBUDGET_2010 et EBUDGET_2011.
Pourquoi si je fais :
Code :
SELECT ... EBUDGET_2010.TABLE
OK
Code :
SELECT ... EBUDGET_2011.TABLE
KO
Code :
SELECT ... TABLE@EBUDGET_2011
OK

Pourtant EBUDGET_2011 est un schemas donc je devrais pas mettre @EBUDGET_2011 pour que ca fonctionne. Et pourtant EBUDGET_2011.table ca fonctionne pas alors que EBUDGET_2010.table c'est ok...
Tonii est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 15h02   #4
Membre expérimenté
 
François
Inscription : février 2010
Messages : 305
Détails du profil
Informations personnelles :
Nom : François

Informations forums :
Inscription : février 2010
Messages : 305
Points : 535
Points : 535
Bonjour,

Disons que c'est la meme difference qu'entre demander une info a son collegue de bureau, et aller la demander a une personne qui est dans un autre batiment.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
TMP2@minilhc >SELECT count(*) FROM tmp.tmp;
 
  COUNT(*)
----------
     99999
 
 
TMP2@minilhc >SELECT count(*) FROM tmp@my_link2;
 
  COUNT(*)
----------
         2
 
 
TMP2@minilhc >SELECT count(*) FROM tmp;
SELECT count(*) FROM tmp
                     *
ERROR at line 1:
ORA-00942: TABLE OR VIEW does NOT exist
Dans le premier cas, j'ai un utilisateur 'TMP' qui existe avec son schema sur la meme BdD que l'utilisateur TMP2. Je precise donc que je veux co;pter les lignes de la table 'TMP' de l'utilisateur appele TMP.

Dans le second cas, j'utilise une base totalement differente. Ca ete defini a quel base je me connectais lors de la creation du db-link
Code :
1
2
3
CREATE  DATABASE LINK <link_name>
 CONNECT TO <user_name_on_remote_DB> IDENTIFIED BY <his_password> 
 USING '<service_name>';
Et dans le 3eme cas, comme je precise rien, je regarde sur la table TMP de l'utilisateur courant. Ce qui revient a faire SELECT count(*) from TMP2.TMP;
Malheureusement, cette table n'existe pas pour cet utilisateur la.
Rams7s est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 15h15   #5
Membre à l'essai
 
Inscription : novembre 2009
Messages : 93
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 93
Points : 22
Points : 22
Merci Rams7s, je comprends bien les histoires de schemas, link mais y a encore des choses qui me tracassent.
En fait doit-on créer un link entre 2 schemas?
Dans ton premier cas tu comptes donc le nb de ligne de la table TMP de l'utilisateur TMP en étant TMP2 ok. Mais faut-il pour cela créer un link entre les deux schemas? Ou le fait que ce soit la même base la lecture est possible par defaut?

Aussi autre question, entre deux bases A et B. Si je veux que A puisse lire sur B.
Code :
A> SELECT count(*) FROM tab@my_link2;
avec un dblink bien sur. Faut créer le DBlink sur A pour lire B. Ou le créer sur B pour autoriser A à venir lire? Ou sur les deux bases?
Tonii est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 15h31   #6
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Il faut le créer dans la base qui va l'utiliser bien entendu, donc dans A
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 15h51   #7
Membre à l'essai
 
Inscription : novembre 2009
Messages : 93
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 93
Points : 22
Points : 22
Ok merci pour vos réponses
Je comprends beaucoup mieux.
Entre temps j'ai trouvé d'ou venait mon problème.

Sur mon schema EBUDGET j'ai des utilisateurs EBUDGET_2009, EBUDGET_2010, EBUDGET_2011 (qui sont des schemas) avec pour chaque utilisateur deux tables.
Or pour l'utilisateur EBUDGET_2011 je vois qu'une table, c'est pour ca qu'il me marque "table or view does not exist" lorsque j'interroge cette fameuse table qu'il ne voit pas. Alors qu'il voit l'autre...
Comment faire pour que les deux tables apparaissent?
Tonii est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 16h39   #8
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
Il faut que le propriétaire de la table donne le droit de voir la table (grant select)

Maintenant, si les 2 tables sont normalement créées dans chaque schéma, et que l'utilisateur EBUDGET_2011 n'en possède qu'une.. alors c'est qu'il manque simplement la table.

maintenant le plus simple c'est de voir les objets au niveau base (avec le propriétaire). A faire en tant qu'utilisateur ayant le rôle dba
Code :
1
2
3
SELECT owner, table_name
  FROM all_tables  
  WHERE table_name = 'TATABLE'
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 11h25   #9
Membre à l'essai
 
Inscription : novembre 2009
Messages : 93
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 93
Points : 22
Points : 22
Merci McM, j'ai effectivement donné les droits à EBUDGET de voir la table en question du schema EBUDGET_2011 et ca marche

Bon et bien le sujet est résolu, merci à tous et bonnes vacances pour ceux qui partent
Tonii est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h36.


 
 
 
 
Partenaires

Hébergement Web