[Kinh nghiệm] – Các vấn đề về LocalDB

LocalDB là gì? Các vấn đề về LocalDB? Cách tạo login user cho LocalDB instance? Cách config timeout cho LocalDB instance? Tất cả tôi sẽ chia sẻ với kinh nghiệm bản thân.

Các bạn có thể tìm hiểu về SQL LocalDB tại các trang sau đây:

Và sau đây là một số lưu ý khi làm việc với LocalDB.

1.) Giới hạn về quyền khi chia sẽ LocalDB instance

Bản chất LocalDB là Local; Nghĩa là DB sẽ được một account nào đó trong Domain/Machine chịu trách nhiệm tạo và quản lý. Nghĩa là theo mặc định, các thông tin về LocalDB sẽ là private. Các user trong một PC không thể dùng chung LocalDB instance nếu bạn không chủ động share instance đó.

Ví dụ: Bạn login vào máy tính của bạn với account phamt. Sau đó, bạn mở CMD và tiến hành tạo một LocalDB instance; Thì instance đó sẽ là private cho user mà bạn đang login vào PC.

Tôi tạo một LocalDB instance tên DevLocalDB bởi user phamt

Create LocalDB instance through CMD

Sau đó tôi kiểm tra thông tin của instance vừa tạo.

Get LocalDB instance information through CMD

Bạn có thấy thông tin Owner không? Đó là user của tôi – cũng chính là user tôi dùng để chạy CMD. Sau đó tôi tiếp tục start instance DevLocalDB kia.

Start LocalDB instance

Tôi vẫn start được với chính user đã tạo ra nó. Tiếp tục tôi sẽ share instance này trên PC của tôi với tên SharedLocalDB

share localdb instance failed

Tôi không thể share instance này bởi chính user đã tạo ra nó. Điều đó có nghĩa là user khác cũng sẽ không thể share instance này. Sau cùng tôi sẽ chạy CMD dưới quyền Admin của user hiện tại là phamt

share localdb instance successful

Tôi đã share thành công. Sau đây là thông tin tôi lấy được từ SharedLocalDB.

get shared localdb instance information

Qua ví dụ trên ta thấy rằng LocalDB đúng bản chất là Local. Bạn phải có đủ quyền để có thể thao tác với LocalDB instance. LocalDB thật chất có thể share như trên cho nhiều user trên một máy sử dụng nhưng chung quy lại đó không phải là lựa chọn tốt nhất khi mà bạn dùng LocalDB trong khi DB có thể được control hay access từ nhiều user và nhiều process. Bạn sẽ bị hạn chế về quyền khi muốn thao tác với LocalDB cái mà được tạo bởi user khác.

Còn đây là vấn đề của tôi. Tôi có một process độc lập là ABC cần truy cập đến một instance của LocalDB (dĩ nhiêu nếu instance đó không tồn tại thì process ABC này sẽ phải tự tạo và sử dụng). Trong khi đó một process khác là XYZ cũng có nhu cầu sử dụng cùng LocalDB instance với process kia. Nghĩa là cả hai process dùng chung một instance và cái nào chạy trước thì tự tạo và share cho process sau sử dụng (Do yêu cầu chia sẽ data giữa hai process). Và tôi gập phải vấn đề khi mà process XYZ chạy trước và chạy dưới quyền của một user khác mà user đó không đủ quyền để share instance. Sau đó ABC chạy lên, vì chưa được share nên ABC không thể tìm thấy instance của XYZ. Thế nên nó lại tự tạo instance cho riêng mình. Cuối cùng , giả sử XYZ cũng tạo thành công một instance. Vậy ta có hai instance cùng tên trên một PC và thuộc hai user khác nhau. Giả sử như cả hai user kẻ trên đều có quyền Admin thì chúng ta sẽ không gặp vấn đề về tạo và share nhưng nếu instance được tạo bởi XYZ bị stop thì ABC không thể start nó lên để sử dụng.

Để giải quyết vấn đề của mình, tôi sẽ viết một file Batch chỉ chịu trách nhiệm kiểm tra sự tồn tại của instance và tạo ra nếu chưa có. Sau đó, khi chạy hai process kia tôi sẽ buộc chúng gọi Batch file này với cùng một user đủ quyền Admin mặc kệ chính chúng được chạy bởi user khác. Nghĩa là file Batch luôn được chạy với cùng một user đủ quyền Admin chứ không phải hai như trước. Cùng một user thì việc start instance cũng dễ hơn.

2.) LocalDB instance sẽ tự động stop

LocalDB instance sẽ tự động stop khi sau một thời gian không có yêu cầu truy vấn. Nhưng ngay khi có truy vấn data thì instance sẽ được tự động start lại. Để thay đổi giá trị timeout này chúng ta chạy command sau.

sp_configure 'user instance timeout', 65535;
GO
RECONFIGURE;
GO

5 là giá trị Min và 65535 là giá trị Max và 0 là tắt tính năng tự động Stop. Nếu chỉ chạy đoạn command trên bạn sẽ nhận lỗi “The configuration option ‘user instance timeout’ does not exist, or it may be an advanced option.” vì đây là một config nâng cao. Bạn cần enable advance config.

sp_configure 'show advanced options', 1;
RECONFIGURE;
GO
sp_configure 'user instance timeout', 65535;
GO
RECONFIGURE;
GO

Để xem các config bạn run command sau.

SELECT * from sys.configurations
ORDER BY name
GO

3.) Chỉ có thể access vào LocalDB instance bởi chính user đã tạo ra nó.
Như trên đã nói, một LocalDB instance là private cho chính user đó. Để có thể dùng cho nhiều user bạn cần share instance và tạo SQL user. Cần chạy command sau ngay khi tạo xong instance để các user khác có thể access.

IF NOT EXISTS(SELECT name FROM sys.server_principals WHERE name = 'tuanpham')
begin 
	CREATE LOGIN tuanpham
		WITH PASSWORD    = N'tuanpham123',
		CHECK_POLICY     = OFF,
		CHECK_EXPIRATION = OFF;
	EXEC sp_addsrvrolemember
		@loginame = N'tuanpham', 
		@rolename = N'sysadmin';
end;
GO

Sau đây là link tải các file Batch liên quan việc tạo LocalDB.

SQL CMD script

Phạm Tuân

Cách gộp các Dll vào ứng dụng WPF
Preprocessor Directives trong C# là gì?
Tạo Facebook App trong 1 phút - new version
Hãy bình luận trực tiếp ở đây để được trả lời nhanh hơn. 1 bình luận.

Trả lời