Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm thế nào để thực hiện một cơ chế khóa đơn giản cho ứng dụng nhiều người dùng?

Một giải pháp đơn giản mà tôi đã triển khai trong một ứng dụng ....

CREATE TABLE RecordLocks(
[RecordId] [varchar](8) NOT NULL,
[UserName] [varchar](100) NOT NULL,
[datetimestamp] [smalldatetime] NOT NULL,
[PC] [varchar](100) NOT NULL

)
GO

datetimestamp có mặc định là GetDate() RecordId là một VARCHAR vì khóa chính trong bảng mà tôi đang khóa (không phải lựa chọn của tôi). Ngoài ra, bảng này có các chỉ mục rõ ràng

CREATE PROCEDURE usp_LockRecord @RecordId VARCHAR(8), @UserName VARCHAR(100), @ComputerName VARCHAR(100)
AS
BEGIN
BEGIN TRAN; 
DELETE FROM RecordLocks WHERE DATEDIFF(HOUR, datetimestamp, GETDATE()) > 2; 
IF NOT EXISTS (Select * from RecordLocks WHERE RecordId = @RecordId) 
    INSERT INTO RecordLocks (RecordId, username, PC) VALUES (@RecordId, @UserName, @ComputerName); 

Select * from RecordLocks WHERE RecordId = @RecordId; 
COMMIT TRAN;
END
GO

Lần đầu tiên xóa và ghi lại các bản ghi cũ hơn 2 giờ (thay đổi cho phù hợp)

Kiểm tra xem không có bản ghi nào đã khóa cái cần khóa và nếu không hãy lắp khóa.

Chọn bản ghi với RecordId mà chúng tôi quan tâm.

Sau đó trong phần kiểm tra mã gọi điện để xem khóa đã thành công hay chưa. Nếu tên người dùng và PC quay lại từ lựa chọn khớp với dữ liệu vừa được chuyển vào khóa thì đã thành công. Nếu tên người dùng trùng khớp nhưng PC không cùng người dùng thì bản ghi sẽ được mở trên một máy khác. nếu tên người dùng không khớp với người dùng khác đã mở nó. Tôi hiển thị thông báo cho người dùng nếu I.E của nó không thành công Bản ghi này hiện đang bị khóa bởi JoeB trên máy trạm XYZ.

Khi người dùng lưu bản ghi hoặc điều hướng đi, chỉ cần xóa khóa bản ghi.

Tôi chắc chắn rằng có những cách khác nhưng điều này hoạt động tốt cho tôi.

Cập nhật

Bản ghi sẽ chỉ được chèn nếu một bản ghi không tồn tại. Lựa chọn sau sẽ trả về một bản ghi. Nếu tên người dùng và / hoặc máy tính khác với dữ liệu bạn cố gắng chèn bản ghi đã bị khóa bởi một người dùng khác (hoặc cùng một người dùng trên một máy khác). Vì vậy, một cuộc gọi làm tất cả (có thể nói như vậy). Vì vậy, nếu tôi thực hiện cuộc gọi Exec usp_LockRecord(1234, 'JoeB', 'Workstation1') và bản ghi tôi lấy lại khớp với dữ liệu mà tôi đã khóa thành công bản ghi đó. Nếu tên người dùng và / hoặc PC tôi lấy lại khác thì hồ sơ đã bị khóa. Sau đó, tôi có thể hiển thị thông báo cho người dùng thông báo rằng bản ghi đã bị khóa, đặt các trường chỉ đọc, tắt các nút lưu và cho họ biết ai có khóa trên đó nếu tôi muốn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm dữ liệu cho mỗi năm tài chính tiếp theo trong truy vấn mdx

  2. Trong SQL, làm cách nào để tôi có thể chia các giá trị trong tổng số mặt nạ bit thành một chuỗi được phân tách bằng dấu phẩy

  3. MS SQL Server:Kiểm tra xem liệu người dùng có thể thực thi một thủ tục được lưu trữ hay không

  4. Mệnh đề VALUES trong SQL Server

  5. C # / SQL:sao lưu và khôi phục bằng cách sao chép và thay thế các tệp cơ sở dữ liệu?