Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana cara menerapkan mekanisme kunci sederhana untuk aplikasi multi-pengguna?

Solusi sederhana yang saya terapkan dalam sebuah aplikasi ....

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

)
GO

datetimestamp memiliki default GetDate() RecordId adalah VARCHAR karena kunci utama dalam tabel yang saya kunci (bukan pilihan saya). Juga tabel ini memiliki indeks yang jelas

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

Hapus pertama dan rekam lebih dari 2 jam (ubah sesuai keinginan)

Periksa tidak ada catatan yang sudah mengunci yang akan dikunci dan jika tidak memasukkan kunci.

Pilih rekaman dengan RecordId yang kami minati.

Kemudian pada kode panggilan periksa untuk melihat apakah kunci telah berhasil. Jika nama pengguna dan PC yang kembali dari pilih cocok, data yang baru saja dimasukkan di kunci berhasil. Jika nama pengguna cocok tetapi PC tidak, pengguna yang sama memiliki catatan yang terbuka di mesin yang berbeda. jika nama pengguna tidak cocok, pengguna lain sudah membukanya. Saya menampilkan pesan kepada pengguna jika tidak berhasil IE Catatan ini saat ini dikunci oleh JoeB di workstation XYZ.

Saat pengguna menyimpan catatan atau menavigasi, hapus saja kunci catatan.

Saya yakin ada cara lain tetapi ini bekerja dengan baik untuk saya.

Perbarui

Catatan hanya akan dimasukkan jika tidak ada. Pilihan berikut akan mengembalikan catatan. Jika nama pengguna dan/atau pc berbeda dengan data yang Anda coba masukkan, catatan telah dikunci oleh pengguna lain (atau pengguna yang sama pada mesin yang berbeda). Jadi satu panggilan melakukan semua (sehingga untuk berbicara). Jadi jika saya melakukan panggilan Exec usp_LockRecord(1234, 'JoeB', 'Workstation1') dan catatan yang saya dapatkan kembali cocok dengan data yang berhasil saya kunci pada catatan itu. Jika username dan/atau PC yang saya kembalikan berbeda maka record sudah terkunci. Saya kemudian dapat menampilkan pesan kepada pengguna yang menyarankan agar catatan dikunci, membuat bidang hanya dapat dibaca, menonaktifkan tombol simpan dan memberi tahu mereka siapa yang memiliki kunci di atasnya jika saya mau.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SELECT * INTO mempertahankan ORDER BY di SQL Server 2008 tetapi tidak 2012

  2. Hapus Acara dari Database Mail Log di SQL Server (T-SQL)

  3. Tanggal di IST di SQL Server

  4. Bagaimana saya bisa menggunakan pivot?

  5. Bagaimana Memetakan Kolom Input dan Output secara dinamis di SSIS?