Access
 sql >> Teknologi Basis Data >  >> RDS >> Access

Hindari Konflik Angka dengan Urutan Microsoft SQL

Hindari Konflik Angka dengan Urutan Microsoft SQL

Catatan:Saya akan mempresentasikan topik ini di grup Access with SQL Server online. Bergabunglah dengan saya pada 13 September pukul 18:30 CST, bergabunglah dengan grup untuk mendapatkan email berisi semua detail rapat, gratis!

  • Apakah Anda perlu menjamin bahwa nomor dalam suatu bidang hanya akan digunakan sekali dan tidak pernah diduplikasi oleh pengguna lain?
  • Apakah Anda pernah mengalami situasi di mana Anda membutuhkan lebih dari satu nomor otomatis dalam sebuah tabel?
  • Pernahkah Anda membutuhkan batas bawah dan batas atas nomor urut, dan Anda tidak dapat melampauinya?
  • Apakah Anda terkadang memiliki daftar nomor yang ingin didaur ulang setelah Anda melewati yang terakhir?

Di SQL Server, ada fitur yang bisa menangani ini dengan cukup mudah, dan itu disebut sequence. Ini tersedia mulai dari SQL Server 2012.

Seperti autonumber, ini dapat memastikan bahwa nomor unik akan diberikan setiap kali, kecuali jika didaur ulang.

Baru-baru ini saya diminta untuk menerapkan urutan untuk klien, di mana banyak pengguna akan membuat catatan baru dan harus "mengambil" nomor berikutnya dalam urutan tertentu. Kami tidak dapat menggunakan nomor otomatis karena pelanggan dibatasi pada rentang tertentu, tidak melebihi ambang batas atas. Ketika nomor di mana habis, manajemen akan mengisi urutan baru.

Mengapa menggunakan tabel Access tidak berfungsi

Sebelum memutakhirkan ke SQL Server, pengguna akan berbagi tabel yang akan mengawasi nomor apa yang akan digunakan berikutnya, masalah dengan pendekatan ini adalah bahwa itu bukan bukti bodoh, dua pengguna dapat meminta nomor yang sama pada waktu yang sama persis, melanggar aturan bisnis.

Membuat dan menggunakan Urutan SQL Server

Sebelum Anda dapat menggunakan urutan, itu harus dibuat dengan sintaks berikut di SQL Server, Anda hanya perlu melakukannya sekali:
CREATE SEQUENCE dbo.seqPolicyNumber AS int MIN 50005000 MAX 50005999;
Gunakan pernyataan berikut untuk mengambil nomor urut berikutnya:
SELECT NEXT VALUE FOR dbo.seqPolicyNumber as NextValue
Pengguna Anda memerlukan izin pembaruan untuk menggunakan urutan, tetapi mereka seharusnya tidak dapat mengubah rentang urutan. Izin pembaruan dapat diberikan menggunakan sintaks ini:
GRANT UPDATE ON dbo.seqPolicyNumber TO [MyDatabaseUserOrRole];
Untuk mendapatkan nilai urutan berikutnya dari program Microsoft Access VBA, Anda dapat menggunakan pernyataan berikut untuk membaca nilai berikutnya ke dalam kumpulan data ADODB.
strSQL = "SELECT NEXT VALUE FOR dbo.seqPolicyNumber as NextValue"
OpenMyRecordset rs, strSQL
NextValue = rs("NextValue")

Ini adalah cara kami biasanya membuka recordset ADODB di perusahaan kami. Untuk informasi lebih lanjut tentang bagaimana Anda dapat menggunakan OpenMyRecordset, Anda dapat mengklik artikel lain di blog kami:

Kumpulan Rekaman dan Perintah ADODB yang Mudah di Akses

Hal yang menyenangkan tentang sintaks untuk mendapatkan nomor urut berikutnya adalah sangat mudah digunakan di T-SQL. Anda cukup mengganti NILAI BERIKUTNYA UNTUK di mana Anda biasanya mendapatkan nilai dari nama bidang, parameter, atau konstanta. Berikut ini menunjukkan bagaimana ini dapat digunakan dalam pernyataan Sisipkan.
INSERT dbo.Orders (OrderID, Name, Qty)
VALUES (NEXT VALUE FOR dbo.OrderNumberSequence, 'Tire', 2);

Lebih banyak fleksibilitas daripada Autonumber

Urutan dapat menawarkan lebih banyak fleksibilitas daripada nomor otomatis di Access, atau bidang IDENTITAS di SQL Server. Pertama, Anda hanya dapat memiliki satu nomor otomatis atau bidang identitas dalam sebuah tabel. Meskipun Anda dapat menyemai ulang bidang IDENTITY, Anda tidak dapat mendaur ulang nilai. Bidang IDENTITAS masih berguna untuk kunci utama, ketika kita menginginkan beberapa nomor arbitrer untuk mengidentifikasi catatan, dan itu tidak memiliki arti. Namun rentang urutan dapat memiliki makna yang tertanam.

Anda juga tidak dibatasi untuk menggunakan bilangan bulat seperti IDENTITAS, tetapi nomor urut juga dapat berupa desimal atau numerik. Anda juga dapat menaikkan urutan ke bawah, bukan hanya ke atas.

Juga urutan tidak terikat ke tabel tertentu dan dapat digunakan di seluruh tabel karena nomor urut baru diperlukan untuk tabel tertentu.

Mengisi Ulang Urutan

Saat Anda ingin mengubah rentang untuk urutan, seperti saat Anda membutuhkan rentang nomor kebijakan baru, itu harus dilakukan dengan prosedur tersimpan. Berikut ini adalah prosedur tersimpan yang dapat melakukan ini.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

BUAT PROSEDUR [dbo].[usp_AlterPolicySequence] (
@SeqName AS sysname,
@InpMin AS int,
@InpMax AS int
) DENGAN EXECUTE SEBAGAI PEMILIK
MULAI
SET NOCOUNT ON;

MENYATAKAN @sql nvarchar(MAX),
@err nvarchar(MAX);

JIKA TIDAK ADA (
SELECT NULL
FROM sys.sequences AS s
WHERE s.name =@SeqName
AND s.schema_id =SCHEMA_ID('dbo')
)
THROW 50000, 'Nama urutan tidak valid.', 1;

JIKA @InpMin IS NULL ATAU @InpMax IS NULL
THROW 50000, ‘Nilai tidak boleh null.’, 1;

SET @sql =CONCAT(N'ALTER SEQUENCE [dbo].', QUOTENAME(@SeqName), N' RESTART WITH ', @InpMin, N' INCREMENT BY 1′, N' MINVALUE ', @InpMin, N' MAXVALUE ' , @InpMax, N' NO CYCLE NO CACHE;');
EXEC sys.sp_executesql @sql;

;

SELESAI

Ada beberapa hal yang perlu diperhatikan dalam stored procedure ini. Pertama kita jalankan
DENGAN EXECUTE AS OWNER AS.

Kami tidak ingin pengguna sehari-hari dapat mengubah urutan. Tetapi kami ingin memberi mereka kemampuan terbatas untuk mengubahnya hanya melalui prosedur tersimpan. (Pengguna hanya memerlukan hak atas prosedur tersimpan.)
GRANT EXECUTE ON dbo.usp_AlterPolicySequence TO [MyDatabaseUserOrRole];
Prosedur tersimpan ini dapat dijalankan dari ujung depan Access, setiap kali rentang baru dalam urutan perlu diinstal, dan itu biasanya dilakukan oleh pengguna admin, yang mungkin memiliki lebih banyak hak istimewa SQL Server daripada pengguna biasa.

Namun prosedur tersimpan ini juga dapat dijalankan ketika rentang angka baru sedang menunggu untuk dimuat ke dalam urutan, tepat setelah urutan saat ini digunakan. Dalam hal ini, prosedur tersimpan dapat dipanggil oleh pengguna mana pun yang membutuhkan nomor polis pertama untuk rentang baru. Jadi kami menggunakan WITH EXECUTE AS OWNER AS untuk memberi mereka lebih banyak hak hanya untuk penggunaan terbatas ini.

Hal lain yang perlu diperhatikan adalah perlunya membuat string SQL, lalu gunakan
EXEC sys.sp_executesql

pada string itu, jika kita menggunakan parameter.

Pernyataan berikut akan berfungsi jika diketik ke dalam jendela kueri SSMS, atau digunakan dalam prosedur tersimpan.

ALTER SEQUENCE dbo.seqPolicyNumber
RESTART WITH 50005000
INCREMENT BY 1
MINVALUE 50005000
MAXVALUE 50005999
NO CYCLE
NO CACHE

Namun yang berikut ini tidak akan bekerja menggunakan parameter dalam prosedur tersimpan.
ALTER SEQUENCE dbo.seqPolicyNumber
RESTART WITH @InpMin
INCREMENT BY 1
MINVALUE @InpMin
MAXVALUE @InpMax
NO CYCLE
NO CACHE

Jadi Anda perlu membuat pernyataan string dengan nilai parameter yang disisipkan.
SET @sql = CONCAT(N'ALTER SEQUENCE [dbo].', QUOTENAME(@SeqName), N' RESTART WITH ', @InpMin, N' INCREMENT BY 1', N' MINVALUE ', @InpMin, N' MAXVALUE ', @InpMax, N' NO CYCLE NO CACHE;');

EXEC sys.sp_executesql @sql;
String @sql ini dibuat menggunakan fungsi CONCAT dan QUOTENAME. Ini juga akan berfungsi jika Anda menggunakan tanda tambah untuk membuat string terakhir Anda, tetapi lebih baik melakukannya seperti contoh yang aman untuk Null.

Prosedur tersimpan ini akan menghasilkan (melempar) kesalahan jika Anda memberikan nilai yang hilang atau buruk, dan Anda tidak akan diizinkan untuk melanjutkan. Ini akan secara otomatis menghasilkan kesalahan jika semua nomor urut habis.

Prosedur Akses ujung depan Anda harus memeriksa untuk melihat bahwa kesalahan tidak terjadi, yang seharusnya hanya terjadi jika urutan kehabisan angka, jika Anda memberikan input parameter yang tepat. Jika kesalahan terlihat, maka ujung depan harus membatalkan operasinya entah bagaimana.

Ada beberapa kemampuan lain yang dapat Anda atur dengan argumen. CYCLE akan memungkinkan urutan untuk berputar lagi setelah mencapai akhir, dan kemudian pergi ke MINVALUE. Anda bahkan dapat memulai ulang secara eksplisit di tengah urutan dengan memberinya nilai RESTART.

Anda juga dapat memberikannya CACHE, misalnya Anda dapat meminta 50 nomor urut sekaligus, dan memperbarui tabel urutan sistem sekali setiap 50 nomor, yang bisa lebih cepat, tetapi juga menambah risiko jika terjadi kegagalan daya , karena nomor ini tidak dapat digunakan kembali

Hal terakhir yang perlu diperhatikan dalam prosedur tersimpan ini adalah Anda dapat menarik informasi (meta-data) tentang urutan Anda dari tampilan sistem yang disebut sys.sequences. Ini berisi informasi berikut.


Beberapa kolom berguna yang mungkin ingin Anda baca dan sampaikan kepada pengguna adalah minimum_value, maximum_value, dan nilai_saat ini.


Jika Anda tertarik, halaman berikut di MSDN memiliki informasi yang sangat berguna tentang urutan.

Nomor Urutan
Menjelaskan urutan dan memiliki contoh yang sangat baik untuk penggunaan umum

BUAT URUTAN (Transact-SQL)

ALTER SEQUENCE (Transact-SQL)

NILAI BERIKUTNYA UNTUK (Transact-SQL)

sys.sequences (Transact-SQL)
Menjelaskan meta-data yang dapat Anda kueri pada urutan Anda


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mendeklarasikan dan Menginisialisasi Variabel di Baris yang Sama di VBA

  2. Temukan Semua Query yang Menggunakan Tabel Tertentu

  3. Korupsi MS Access Bagian 2:Praktik Terbaik untuk Pencegahan dan Pemulihan

  4. Mengapa Anda Harus Menggunakan PHPs PDO untuk Akses Database

  5. Cara Menggunakan Access sebagai CRM