Quando si utilizza SQL Server Express 2005 di funzione User Instance con una stringa di connessione come questo:Come si interrompe un'istanza utente di Sql Server? (File di database istanza utente SQL Express bloccati, anche dopo l'arresto SQL Express service)
<add name="Default" connectionString="Data Source=.\SQLExpress;
AttachDbFilename=C:\My App\Data\MyApp.mdf;
Initial Catalog=MyApp;
User Instance=True;
MultipleActiveResultSets=true;
Trusted_Connection=Yes;" />
Troviamo che non possiamo copiare il file di database MyApp.mdf e MyApp_Log.ldf (perché sono bloccati) anche dopo aver arrestato il servizio SqlExpress e devono ricorrere all'impostazione del servizio SqlExpress dalla modalità di avvio automatico a manuale, quindi riavviare la macchina, prima di poter copiare i file.
Sono stato a conoscenza del fatto che l'arresto del servizio SqlExpress dovrebbe interrompere anche tutte le istanze utente, che dovrebbero rilasciare i blocchi su tali file. Ma questo non sembra essere il caso - qualcuno potrebbe far luce su come fermare un'istanza utente, in modo tale che i suoi file di database non siano più bloccati?
Aggiornamento
OK, ho smesso di essere pigro e sparato su Process Explorer. Blocco è stata tenuta da sqlserver.exe - ma ci sono due istanze di SQL Server:
sqlserver.exe PID: 4680 User Name: DefaultAppPool
sqlserver.exe PID: 4644 User Name: NETWORK SERVICE
Il file è aperto dall'istanza sqlserver.exe con il PID: 4680
Arresto del "SQL Server (SQLEXPRESS) "servizio, ucciso dal processo con PID: 4644, ma lasciato PID: 4680 da solo.
Visto che il proprietario del processo rimanente era DefaultAppPool, la prossima cosa che ho provato è stata l'arresto di IIS (questo database viene utilizzato da un'applicazione ASP.Net). Sfortunatamente questo non ha eliminato il processo.
L'eliminazione manuale del processo del server sql rimanente rimuove l'handle di file aperto sui file di database, consentendo di copiarli/spostarli.
Sfortunatamente, desidero copiare/ripristinare quei file in alcune attività di installazione pre/post di un programma di installazione di WiX - come tale speravo che ci potesse essere un modo per ottenere ciò arrestando un servizio di Windows, piuttosto che doverlo sborsare per uccidere tutte le istanze di sqlserver.exe come quella pone alcuni problemi:
- uccidendo tutte le istanze sqlserver.exe possono avere consequencies indesiderabili per gli utenti con altre istanze di SQL Server sulle loro macchine.
- Impossibile riavviare facilmente tali istanze.
- Introduce ulteriori complessità nell'installer.
Qualcuno ha ulteriori informazioni su come arrestare le istanze di SQL Server associate a un'istanza utente specifica?
AThanks per le risposte tutte - la risposta più utile è stata utilizzare SSEUtil.exe. Anche se abbiamo bisogno di invocare questo da un programma di installazione WiX, possiamo vedere che sarà un po 'problematico, cioè se l'utente che esegue il programma di installazione non ha le autorizzazioni per eseguire uno sp_dettach_db che è un problema indipendentemente dal metodo che usiamo - quindi potremmo è sufficiente fornire alcuni passaggi manuali di pre-installazione per gli utenti prima dell'aggiornamento, in modo che possano gestirli autonomamente utilizzando SSEUtil.exe. – Bittercoder
Sono curioso, SSEUtil.exe non funziona intorno al problema dei permessi? Se l'utente deve gestirlo da solo usando SSEUtil, allora il programma di installazione non dovrebbe funzionare invocando SSEUtil? – AMissico
Nei miei test questo non è sembrato essere il caso - credo che fosse solo perché l'installer non era elevato quando si invocava SSEUtil ... ma non ho avuto il tempo di approfondirlo ulteriormente. Su una nota a margine abbiamo rilevato che SSEUtil non elenca tutte le istanze utente attive correttamente su Windows 7 x64 con SqlServer e SqlServer Express installati, anche quando si passa nel parametro -s. \ SqlExpress. Quindi abbiamo ancora alcuni casi limite da risolvere :) – Bittercoder