Przy użyciu programu SQL Server Express 2005 wyposażone użytkownika instancji w ciągu połączenia jak poniżej:Jak zatrzymać wystąpienie użytkownika serwera Sql? (SQL Express użytkownika instancji pliki bazy danych zablokowane, nawet po zatrzymaniu 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;" />
Uważamy, że nie można skopiować pliki baz danych MyApp.mdf i MyApp_Log.ldf (ponieważ są zablokowane) nawet po zatrzymaniu usługi SqlExpress, i muszą uciekać się do ustawienia usługi SqlExpress od automatycznego do ręcznego trybu uruchamiania, a następnie ponownego uruchomienia komputera, zanim będziemy mogli następnie skopiować pliki.
To było moje zrozumienie, że zatrzymanie usługi SqlExpress powinno również zatrzymać wszystkie wystąpienia użytkowników, co powinno zwolnić blokady tych plików. Ale tak się nie dzieje - czy ktoś mógłby rzucić trochę światła na sposób zatrzymania instancji użytkownika, tak, że pliki bazy danych nie są już zablokowane?
Aktualizacja
OK, ja przestałem być leniwy i wystrzelił w górę Process Explorer. Zamek był w posiadaniu sqlserver.exe - ale istnieją dwie instancje serwera SQL:
sqlserver.exe PID: 4680 User Name: DefaultAppPool
sqlserver.exe PID: 4644 User Name: NETWORK SERVICE
plik jest otwarty przez sqlserver.exe przykład z PID: 4680
Zatrzymanie „SQL Server (SQLEXPRESS) "usługa, zgasiła proces z PID: 4644, ale opuściła PID: 4680 sam.
Widząc jako właściciela pozostałego procesu był DefaultAppPool, następną rzeczą, którą próbowałem, było zatrzymanie IIS (ta baza danych jest używana z aplikacji ASP.Net). Niestety to też nie zabiło procesu.
Ręczne usunięcie pozostałego procesu serwera sql powoduje usunięcie uchwytu pliku otwartego w plikach bazy danych, umożliwiając ich skopiowanie/przeniesienie.
Niestety, chciałbym skopiować/przywrócić te pliki w niektórych zadaniach instalacyjnych przedinstalacyjnych/pocztowych instalatora WiX - jako takie miałem nadzieję, że może być sposób na osiągnięcie tego poprzez zatrzymanie usługi Windows, a następnie konieczność wypakowania zabić wszystkich wystąpień sqlserver.exe jako że stwarza pewne problemy:
- zabijając wszystkich sqlserver.exe instancji może mieć niepożądane consequencies dla użytkowników z innych instancji serwera SQL na swoich maszynach.
- Nie można łatwo ponownie uruchomić tych instancji.
- Wprowadza dodatkowe komplikacje do instalatora.
Czy ktoś ma jakiekolwiek dalsze przemyślenia na temat zamykania wystąpień serwera sql powiązanego z określoną instancją użytkownika?
Zastanawia się nad wszystkimi odpowiedziami - najbardziej użyteczną odpowiedzią było użycie SSEUtil.exe. Chociaż musimy wywołać to z instalatora WiX, widzimy, że będzie to trochę problematyczne, tzn. Jeśli użytkownik uruchamiający instalator nie ma uprawnień do wykonania sp_dettach_db, co jest problemem niezależnie od używanej przez nas metody - możemy więc wystarczy ręcznie wykonać kilka czynności przed instalacją, aby sami mogli sobie z tym poradzić za pomocą SSEUtil.exe. – Bittercoder
Jestem ciekawy, czy SSEUtil.exe nie działa w związku z problemem uprawnień? Jeśli użytkownik musi sam sobie z tym poradzić za pomocą SSEUtil, to czy instalator nie powinien wywoływać SSEUtil? – AMissico
W moich testach nie wydaje się, aby tak było - wierzę, że było tak dlatego, że instalator nie został podniesiony podczas wywoływania SSEUtil ... ale nie miałem czasu, aby to jeszcze zbadać. Na marginesie stwierdziliśmy, że SSEUtil nie będzie poprawnie wyświetlał wszystkich aktywnych instancji użytkowników na Windows7 x64 z zainstalowanymi SqlServer i SqlServer Express, nawet jeśli przekazujemy parametr -s. \ SqlExpress. Nadal mamy kilka skrajnych przypadków do opracowania :) – Bittercoder