Khi sử dụng tính năng Instance tài khoản SQL Server Express 2005 với một chuỗi kết nối như thế này:Làm thế nào để bạn dừng một trường hợp người dùng của Sql Server? (SQL Express sử dụng ví dụ các file cơ sở dữ liệu bị khóa, thậm chí sau khi ngừng dịch vụ Sql Express)
<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;" />
Chúng tôi thấy rằng chúng ta không thể sao chép Các tệp cơ sở dữ liệu MyApp.mdf và MyApp_Log.ldf (vì chúng bị khóa) ngay cả sau khi ngừng dịch vụ SqlExpress và phải đặt dịch vụ SqlExpress từ chế độ khởi động tự động sang thủ công, rồi khởi động lại máy, trước khi chúng ta có thể sao chép Tập tài liệu.
Đó là sự hiểu biết của tôi rằng dừng dịch vụ SqlExpress cũng sẽ dừng tất cả các phiên bản người dùng, điều này sẽ giải phóng khóa trên các tệp đó. Nhưng điều này dường như không phải là trường hợp - bất cứ ai có thể làm sáng tỏ một số cách để ngăn chặn một cá thể người dùng, sao cho các tệp cơ sở dữ liệu của nó không còn bị khóa nữa?
Cập nhật
OK, tôi dừng lại lười biếng và bắn lên Process Explorer. Khóa đã được tổ chức bởi sqlserver.exe - nhưng có hai trường hợp máy chủ sql:
sqlserver.exe PID: 4680 User Name: DefaultAppPool
sqlserver.exe PID: 4644 User Name: NETWORK SERVICE
Các tập tin được mở bởi instance sqlserver.exe với PID: 4680
Dừng "SQL Server (SQLEXPRESS) "dịch vụ, giết chết quá trình với PID: 4644, nhưng lại PID: 4680 một mình.
Thấy chủ sở hữu của quá trình còn lại là DefaultAppPool, điều tiếp theo tôi đã thử là dừng IIS (cơ sở dữ liệu này đang được sử dụng từ ứng dụng ASP.Net). Thật không may điều này đã không giết chết quá trình.
Thủ công giết chết quá trình máy chủ sql còn lại sẽ xóa xử lý tệp đang mở trên các tệp cơ sở dữ liệu, cho phép chúng được sao chép/di chuyển. Không may là tôi muốn sao chép/khôi phục các tệp đó trong một số tác vụ cài đặt trước/sau của trình cài đặt WiX - vì vậy tôi hy vọng có thể có cách để đạt được điều này bằng cách dừng dịch vụ cửa sổ, thay vào đó phải loại bỏ để giết tất cả các trường hợp của sqlserver.exe vì điều đó đặt ra một số vấn đề:
- Giết tất cả các trường hợp sqlserver.exe có thể có hậu quả không mong muốn cho người dùng với các phiên bản Sql Server khác trên máy của họ.
- Tôi không thể khởi động lại các trường hợp đó một cách dễ dàng.
- Giới thiệu các phức tạp bổ sung vào trình cài đặt.
Có ai có thêm bất kỳ suy nghĩ nào về cách tắt máy chủ sql được liên kết với một cá thể người dùng cụ thể không?
Trả lời tất cả câu trả lời - câu trả lời hữu ích nhất là sử dụng SSEUtil.exe. Mặc dù chúng ta cần gọi điều này từ một trình cài đặt WiX nhưng chúng ta có thể thấy nó có vấn đề nhỏ nếu người dùng chạy trình cài đặt không có quyền thực thi sp_dettach_db, đây là vấn đề bất kể chúng ta sử dụng phương thức nào - vì vậy chúng ta có thể chỉ cung cấp một số bước cài đặt thủ công cho người dùng trước khi nâng cấp để họ có thể tự xử lý bằng SSEUtil.exe. – Bittercoder
Tôi tò mò, không SSEUtil.exe làm việc xung quanh vấn đề cho phép? Nếu người dùng phải tự xử lý bằng SSEUtil, thì công việc cài đặt có nên gọi SSEUtil không? – AMissico
Trong các thử nghiệm của tôi, điều này dường như không phải là trường hợp - tôi tin nó chỉ vì trình cài đặt không được nâng lên khi gọi SSEUtil ... nhưng tôi chưa có thời gian để điều tra thêm. Lưu ý rằng SSEUtil sẽ không liệt kê tất cả các cá thể người dùng đang hoạt động chính xác trên Windows7 x64 với cả SqlServer và SqlServer Express được cài đặt, ngay cả khi truyền tham số -s. \ SqlExpress. Vì vậy, chúng tôi vẫn còn một số trường hợp để giải quyết :) – Bittercoder