Newsgroup: it.comp.lang.visual-basic
Titolo: [?][Ado][Oracle][OT?] Stringa di connessione ad Oracle e tablespace

Ogni utente Oracle ha un tablespace predefinito su cui operare.
Es. quando mi connetto ad Oracle con utente 'pippo' automaticamente accedo
al tablespace 'topolinia'.
Il problema è il seguente:
Se mi connetto come utente privilegiato (esempio 'system') ho accesso a
tutti i tablespace, ma per utilizzarne uno in particolare devo preporre ad
ogni nome di tabella anche il nome del tablespace.
Cioè:
se entro come 'pippo' posso fare 'select * from personaggi' dove personaggi
è una tabella del db 'topolinia'.
se entro come 'system' la query precedente non funziona perchè (giustamente)
Oracle non sa in quale tablespace si trova la tabella. Per cui sono
costretto ad eseguire  'select * from topolinia.personaggi'.
Detto ciò non esiste qualche proprietà della connectionstring di ADO tale
per cui posso autenticarmi come 'system' ma utilizzare come default il
tablespace 'topolinia'?
Per SQL server basta scrivere database=topolinia.
So per certo che Oracle non supporta la clausola USE (che mi avrebbe
comunque risolto il problema).
thanks,
x:termoPilucco, che non è il DBA della Disney

 comunque risolto il problema).
La soluzione non sta in ADO, ma in Oracle:
1) devi connetterti come pippo e dare il grant sulla tabella personaggi a
tutti gli utenti (o ruoli) a cui vuoi dare l'accesso a tale tabella,
    il tipo di accesso dipende da te e puo essere insert, delete, update,
select...
Quando hai dato il grant sulla tabella, ti devi connettere come altro utente
ad esempio Paperone, e a questo punto ti devi creare i sinonimi:
Esempio Gant: (da eseguire come utente pippo)
    GRANT DELETE ON "PIPPO"."TOPOLINIA" TO "PAPERONE"
    GRANT INSERT ON "PIPPO"."TOPOLINIA" TO "PAPERONE"
    GRANT SELECTON "PIPPO"."TOPOLINIA" TO "PAPERONE"
    GRANT UPDATE ON "PIPPO"."TOPOLINIA" TO "PAPERONE"
Esempio di crazione sinonimi (Da eseguire come utente paperone)
CREATE OR REPLACE SYNONYM TOPOLINIA FOR PIPPO.TOPOLINIA
a questo punto l'utente paperone accede alla tabella pippo.topolinia,
invocandola solo come topolinia

 invocandola solo come topolinia.
Ok, Grazie.
Quindi visto che il mio problema è semplicemente usare direttamente
TOPOLINIA da parte dell'utente omnipotente 'system', mi basterebbe fargli
creare il sinomino, prima di partire con le query, visto che le grant
dovrebbero essere già in suo possesso.
In pratica io ho una decina di schema, ognuno con un mare di tabelle.
Ho un migliaio di query da far eseguire globalmente a VB.
Utilizzo una connection ADO che si connette al primo schema, esegue un
centanaio di query e si disconnette, e così via, utilizzando di volta in
volta l'utente detentore dello schema.
Il problema è che vorrei fare il tutto da un solo utente (vorrei= il capo
vorrebbe).
Dalle dritte che mi hai dato supporrei una cosa del genere:
-system crea sinonimi per se stesso per tutte le tabelle dello schemaX
-system esegue le query senza dover utilizzare il prefisso dello schema
-system cancella i sinonimi della schemaX
-goto primo passo con nuovo schema.
grazie,
termoPilucco

 -goto primo passo con nuovo schema.
Puoi fare anche così ma puoi ottimizzare. Una domanda, gli oggetti contenuti
in ogni singolo schema
hanno il medesimo nome anche negli altri schema?
ipotesi 1 tutti gli schema contengono oggetti con lo stesso nome:
    system si connette allo schema SCHEMA1
    system crea i sinonimi per sè stesso usando il prefisso nome schema es:
                CREATE OR REPLACE SYNONYM    SCHEMA1TABELLA1     FOR
SCHEMA1.TABELLA1
     system esegue la query usando il sinonimo creato. In relatà la cosa è
piu banale di quanto pensi, poichè per richiamare
    l'oggetto TABELLA1, è sufficiente anteporre al nome della TABELLA1 la
variabile di VB che contiene il nome dello
    schema, che poi è la stessa che usi per aprire a connessione.
    Se ad esempio il nome dello Schema è contenuto nella variabile vb
VbNomeSchemaLoc, succederà qualcosa del tipo:
Dim ConnessioneOracle as connection
Set ConnessioneOracle = new ADODB.Connection
Dim LocRset as Recorset
Set LocRset  = new ADODB.recordset
'Codice per apertura della connessione a tuo carico....
VbNomeSchemaLoc = "SCHEMA1"
ConnessioneOracle.execute "CREATE OR REPLACE SYNONYM    " & VbNomeSchemaLoc
&  "TABELLA1     FOR    SCHEMA1.TABELLA1"
Chiaramente la costruzione delle query deve tener conto della variabile
VbNomeSchemaLoc  , es:
LocRset .open "Select * from " & VbNomeSchemaLoc & "TABELLA1",
ConnessioneOracle
In questo modo la creazione è dinamica, sei sicuro di chiamare sempre
l'oggetto con il nome giusto, e non ti devi preoccupare di cancellare i
sinonimi, che ti sono utili alla prossima esecuzione del programma.
iptesi 2 gli schema contengono oggetti con nomi diversi
    a questo punto non ti devi preoccupare di nulla, crei i sinonimi una
volta per tutte e non li tocchi piu

 una volta per tutte e non li tocchi piu
Sě, avevo in mente questo, ma prima devo verificare bene il punto uno.
grazie,
termoPilucco.