Newsgroup: it.comp.lang.visual-basic
Titolo: [?][Semi-OT][MSSQL][MYSQL]Apertura di una connessione con accesso esclusivo

Come da oggetto dovrei trovare un sistema per accedere in modo esclusivo a
un Database su server MySQL e MSSQL (per access ho già risolto! ;))in modo
da poter aggiornare senza problemi la struttura del DB direttamente dal
programma scritto in VB senza rischio di perdite di dati... Dopo un po' di
ricerche più o meno infruttuose l'unica cosa che mi è venuta in mente è
l'utilizzo una mia tabella di blocco (brutto) per ottenere la cosa in modo
artificioso!
Qualcuno ha qualche altra idea?


Su MySql non ricordo (se ho tempo ci guardo).
Su MSSQL, se accedi con gli opportuni diritti, puoi settare a 'SingleUser'
il database.
Una volta fatto ciò (credo che la sp sia sp_singleuser o la classica
sp_dboption), puoi addirittura cambiare nome al db.
Poi ricordati di disabilitare il single user.
Ciao
Alberto

 sp_dboption), puoi addirittura cambiare nome al db.
Trovato del codice per MSSQL:
EXEC sp_dboption 'Gest_PLANT','single user', true
EXEC sp_renamedb 'Gest_PLANT','Gest_PLANT_OLD'
EXEC sp_dboption 'Gest_PLANT_OLD','single user', false
Ciao
Alberto

 sp_dboption), puoi addirittura cambiare nome al db.
Dalla guida in linea di MS SQL Server 2000:
"Visualizza o modifica le opzioni del database. Non è consigliabile eseguire
sp_dboption nel database master o tempdb. La stored procedure sp_dboption è
disponibile per compatibilità con le versioni precedenti. Per impostare le
opzioni del database. utilizzare ALTER DATABASE."
"SINGLE_USER consente la connessione al database a un solo utente alla
volta. Tutte le altre connessioni utente vengono interrotte. La clausola di
interruzione (termination) dell'istruzione ALTER DATABASE determina il
momento in cui la connessione viene interrotta. I nuovi tentativi di
connessione vengono respinti. Il database rimane in modalità SINGLE_USER
anche se l'utente che ha impostato l'opzione si disconnette. A questo punto,
un altro utente (ma solo uno) può connettersi al database. "
Fa esattamente quello che mi serve a parte un particolare preoccupante:
"Tutte le altre connessioni utente vengono interrotte"?!? Senza preavviso?
Mi sembra pericolosissimo; anche ammettendo di poter controllare che nessuno
sia connesso chi mi garantisce che tra il controllo e l'alter database
(leggasi l'exec della stored procedure) qualcuno non si sia collegato?
.
..
...
....
Leggendo l'help relativo all'alter table ho trovato:
"WITH <termination>
Specifica quando eseguire il rollback di transazioni incomplete quando il
database passa da uno stato all'altro. È possibile specificare una sola
clausola di terminazione, la quale deve seguire le clausole SET.
ROLLBACK AFTER integer [SECONDS] | ROLLBACK IMMEDIATE
Specifica se eseguire il rollback dopo il numero di secondi specificato o
immediatamente. Se la clausola di terminazione viene omessa, ogni
transazione può eseguire il commit o il rollback autonomamente.
NO_WAIT
Specifica che, se non è possibile completare immediatamente la modifica di
opzione o dello stato del database richiesta senza attendere il commit o il
rollback automatico delle transazioni, la richiesta non avrà esito
negativo."
La traduzione della parte relativa a  NO_WAIT mi sembra "confusa" e non sono
riuscito a trovare come far sì che la modifica alle opzioni avvenga solo se
non ci sono altre connessioni aperte oltre alla mia!

 della stored procedure) qualcuno non si sia collegato?
Bel problema.
L'unica cosa (orrida) che mi viene in mente è di disabilitare tutti i login
sul DB (tranne il tuo), eseguire l'Alter Database, fare le modifiche,
eseguire l'Alter Database, quindi riabilitare i login.
Questo però lascia ancora un minimo di rischio durante la disattivazione dei
login...
Del resto, considera che devi fare una cosa molto brusca (modificare il db),
per cui un po' di disciplina degli utenti ci vuole...
Ma se il sw è scritto bene, non ci sono problemi per i dati, perchè le
transazioni vengono tutte portate in rollback.
Ciao
Alberto

 Su MySql non ricordo (se ho tempo ci guardo).
ho trovato GET_LOCK(str,timeout) che dovrebbe permettere di creare un lock
generico basato su una stringa... ora cerco di scorpire in quale tabella di
sistema va a scriverlo... solo che non mi piace per nulla! :(

 transazioni vengono tutte portate in rollback.
Non mi preoccupo tanto per i dati (che dovrebbero essere abbastanza ben
"tutelati") ma per il funzionamento del software vero e proprio: il software
a cui stò lavorando è un gestionale che sfrutta il db tra l'altro per
abilitare o disabilitare la navigazione su un treeview. Se la connessione
salta mentre uno si sposta sul treeview l'errore è intercettato ma non è
certo bello che uno sul più bello si trovi a lottare contro gli inevitabili
messaggi di errore che comparirebbero praticamente ad ogni operazione!
L'applicazione aggiornata dovrebbe idealmente controllare la versione del
database, se non aggiornato dovrebbe cercare di aprirlo in modalità
esclusiva (riuscirci solo se nessun'altro utente è collegato) ed effettuare
l'aggiornamento oppure segnalare errore! In access è fattibile negli altri
devo trovare come farlo...

 access è fattibile negli altri devo trovare come farlo...
Ho capito il tuo problema.
A te serve una cosa che, se ci sono altri utenti sul DB, non si colleghi
proprio.
In questo modo, tu potresti fare un app che comincia a provare a
connettersi, finchè non ci riesce, e a questo punto fai i tuoi giochetti.
Mah....
Prova a scandagliare nelle opzioni della stringa di connessione del Provider
SQLOleDb. Ci sono tante di quelle opzioni, può essere che ci sia anche una
cosa simile all'Exclusive di Access.
Ciao
Alberto