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

Tránh xung đột số với chuỗi Microsoft SQL

Tránh xung đột số với chuỗi Microsoft SQL

Lưu ý:Tôi sẽ trình bày về chủ đề này tại nhóm Access with SQL Server trực tuyến. Vui lòng tham gia với tôi vào ngày 13 tháng 9 lúc 6:30 chiều CST, tham gia nhóm để nhận email cung cấp tất cả chi tiết cuộc họp, hoàn toàn miễn phí!

  • Bạn có cần đảm bảo rằng một số trong một trường sẽ chỉ được sử dụng một lần và không bao giờ bị trùng lặp bởi người dùng khác không?
  • Bạn đã từng gặp trường hợp cần nhiều hơn một lần đánh số tự động trong một bảng chưa?
  • Bạn đã bao giờ cần giới hạn dưới và giới hạn trên của các số tuần tự và bạn không thể vượt quá giới hạn đó không?
  • Đôi khi, bạn có danh sách các số mà bạn muốn tái chế sau khi vượt qua số cuối cùng không?

Trong SQL Server, có một tính năng có thể xử lý điều này khá dễ dàng, và nó được gọi là một chuỗi. Nó có sẵn bắt đầu từ SQL Server 2012.

Giống như một số tự động, nó có thể đảm bảo rằng một số duy nhất sẽ được cung cấp mỗi lần, trừ khi nó tái chế.

Gần đây, tôi đã được yêu cầu triển khai một trình tự cho một ứng dụng khách, nơi nhiều người dùng sẽ tạo các bản ghi mới và phải “tìm nạp” số tiếp theo trong một trình tự cụ thể. Chúng tôi không thể sử dụng số tự động vì khách hàng bị giới hạn trong một phạm vi nhất định, không vượt quá ngưỡng trên. Khi các con số bị cạn kiệt, ban quản lý sẽ bổ sung lại trình tự một lần nữa.

Tại sao sử dụng bảng Access không hoạt động

Trước khi nâng cấp lên SQL Server, người dùng sẽ chia sẻ một bảng sẽ giữ các tab xem đâu là số tiếp theo để sử dụng, vấn đề với cách tiếp cận này là nó không phải là bằng chứng đánh lừa, hai người dùng có thể yêu cầu cùng một số chính xác cùng một lúc, vi phạm quy tắc kinh doanh.

Tạo và sử dụng chuỗi máy chủ SQL

Trước khi bạn có thể sử dụng một chuỗi, nó phải được tạo bằng cú pháp sau trong SQL Server, bạn chỉ cần thực hiện việc này một lần:
CREATE SEQUENCE dbo.seqPolicyNumber AS int MIN 50005000 MAX 50005999;
Sử dụng câu lệnh sau để truy xuất số thứ tự tiếp theo:
SELECT NEXT VALUE FOR dbo.seqPolicyNumber as NextValue Người dùng của bạn
sẽ cần quyền cập nhật để sử dụng trình tự, nhưng họ không thể thay đổi phạm vi của trình tự. Có thể cấp quyền cập nhật bằng cú pháp sau:
GRANT UPDATE ON dbo.seqPolicyNumber TO [MyDatabaseUserOrRole];
Để nhận giá trị tiếp theo của một chuỗi từ chương trình Microsoft Access VBA, bạn có thể sử dụng câu lệnh sau để đọc giá trị tiếp theo vào tập bản ghi ADODB.
strSQL = "SELECT NEXT VALUE FOR dbo.seqPolicyNumber as NextValue"
OpenMyRecordset rs, strSQL
NextValue = rs("NextValue")

Đây là cách chúng tôi thường mở một tập bản ghi ADODB trong công ty của chúng tôi. Để biết thêm thông tin về cách bạn có thể sử dụng OpenMyRecordset, bạn có thể nhấp vào một bài viết khác trong blog của chúng tôi:

Bộ ghi ADODB và lệnh dễ dàng trong truy cập

Điều thú vị về cú pháp để lấy số thứ tự tiếp theo là nó rất dễ sử dụng trong T-SQL. Bạn chỉ cần thay thế GIÁ TRỊ TIẾP THEO CHO nơi bạn thường nhận giá trị từ tên trường, tham số hoặc một hằng số. Phần sau cho thấy cách nó có thể được sử dụng trong câu lệnh Chèn.
INSERT dbo.Orders (OrderID, Name, Qty)
VALUES (NEXT VALUE FOR dbo.OrderNumberSequence, 'Tire', 2);

Linh hoạt hơn Autonumber

Một chuỗi có thể cung cấp tính linh hoạt hơn một số tự động trong Access hoặc trường IDENTITY trong SQL Server. Đầu tiên, bạn chỉ có thể có một số tự động hoặc trường danh tính trong bảng. Mặc dù bạn có thể gửi lại trường IDENTITY, nhưng bạn không thể tái chế các giá trị. Các trường IDENTITY vẫn hữu ích cho các khóa chính, khi chúng ta muốn một số tùy ý nào đó để xác định bản ghi và nó không có ý nghĩa. Tuy nhiên, phạm vi chuỗi có thể có ý nghĩa nhúng.

Bạn cũng không bị hạn chế sử dụng số nguyên như IDENTITY, nhưng số thứ tự cũng có thể là số thập phân hoặc số. Ngoài ra, bạn có thể tăng dần theo trình tự của mình thay vì chỉ tăng.

Ngoài ra, một chuỗi không bị ràng buộc với bất kỳ bảng cụ thể nào và có thể được sử dụng trên các bảng vì số thứ tự mới là cần thiết cho một bảng cụ thể.

Bổ sung trình tự

Khi bạn muốn thay đổi phạm vi cho một chuỗi, chẳng hạn như khi bạn cần một phạm vi số chính sách mới, thì việc này phải được thực hiện với một thủ tục được lưu trữ. Sau đây là quy trình được lưu trữ có thể thực hiện việc này.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

TẠO THỦ TỤC [dbo]. [Usp_AlterPolicySequence] (
@SeqName AS sysname,
@InpMin AS int,
@InpMax AS int
) VỚI THỰC HIỆN NHƯ CHỦ SỞ HỮU
BẮT ĐẦU
ĐẶT SỐ TÀI KHOẢN;

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

NẾU KHÔNG TỒN TẠI (
CHỌN KHÔNG ĐẦY ĐỦ
TỪ sys.sequences AS s
WHERE s.name =@SeqName
AND s.schema_id =SCHEMA_ID ('dbo')
)
THROW 50000, 'Tên trình tự không hợp lệ.', 1;

NẾU @InpMin LÀ KHÔNG HOẶC @InpMax LÀ KHÔNG ĐỦ
THROW 50000, ‘Các giá trị không được rỗng.’, 1;

SET @sql =CONCAT (N'ALTER SEQUENCE [dbo]. ', QUOTENAME (@SeqName), N' RESTART WITH ', @InpMin, N' TĂNG BẰNG 1 ′, N 'MINVALUE', @InpMin, N 'MAXVALUE' , @InpMax, N 'KHÔNG CÓ CHU KỲ KHÔNG CÓ CACHE;');
EXEC sys.sp_executesql @sql;

;

HẾT

Có một số điều đáng lưu ý trong thủ tục được lưu trữ này. Đầu tiên, chúng tôi đang chạy nó
VỚI THỰC HIỆN NHƯ CHỦ SỞ HỮU.

Chúng tôi không muốn người dùng hàng ngày có thể thay đổi trình tự. Nhưng chúng tôi muốn cung cấp cho họ khả năng hạn chế để thay đổi nó chỉ thông qua một thủ tục được lưu trữ. (Người dùng chỉ cần quyền đối với thủ tục đã lưu trữ.)
GRANT EXECUTE ON dbo.usp_AlterPolicySequence TO [MyDatabaseUserOrRole];
Thủ tục được lưu trữ này có thể được chạy từ giao diện người dùng Access, bất cứ khi nào một phạm vi mới trong chuỗi cần được cài đặt và điều đó thường là của người dùng quản trị, người có thể có nhiều đặc quyền SQL Server hơn người dùng bình thường.

Tuy nhiên, thủ tục được lưu trữ này cũng có thể được chạy khi một dải số mới đang chờ được tải vào dãy, ngay sau khi dãy hiện tại được sử dụng hết. Trong trường hợp này, thủ tục được lưu trữ có thể được gọi bởi bất kỳ người dùng nào cần số chính sách đầu tiên cho phạm vi mới. Vì vậy, chúng tôi sử dụng WITH EXECUTE AS CHỦ SỞ HỮU AS để cung cấp cho họ nhiều quyền hơn chỉ cho mục đích sử dụng hạn chế này.

Một điều khác cần lưu ý là cần phải xây dựng một chuỗi SQL, và sau đó sử dụng
EXEC sys.sp_executesql

trên chuỗi đó, nếu chúng ta đang sử dụng các tham số.

Câu lệnh sau sẽ hoạt động nếu được nhập vào cửa sổ truy vấn SSMS hoặc được sử dụng trong một thủ tục được lưu trữ.

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

Tuy nhiên, cách sau sẽ không hoạt động khi sử dụng các tham số trong một quy trình được lưu trữ.
ALTER SEQUENCE dbo.seqPolicyNumber
RESTART WITH @InpMin
INCREMENT BY 1
MINVALUE @InpMin
MAXVALUE @InpMax
NO CYCLE
NO CACHE

Vì vậy, bạn cần tạo câu lệnh chuỗi với các giá trị tham số được dán vào.
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;
Chuỗi @sql này được xây dựng bằng cách sử dụng các hàm CONCAT và QUOTENAME. Nó cũng sẽ hoạt động nếu bạn sử dụng các dấu cộng để tạo chuỗi cuối cùng của mình, nhưng tốt hơn là làm như ví dụ là Null safe.

Quy trình được lưu trữ này sẽ tạo ra (tạo ra) lỗi nếu bạn cung cấp các giá trị bị thiếu hoặc không hợp lệ và bạn sẽ không được phép tiếp tục. Nó sẽ tự động tạo ra lỗi nếu tất cả các số thứ tự được sử dụng hết.

Thủ tục Access giao diện người dùng của bạn nên kiểm tra để biết rằng lỗi chưa xảy ra, lỗi này chỉ xảy ra nếu chuỗi hết số, nếu bạn đang cung cấp đầu vào tham số thích hợp. Nếu lỗi được nhìn thấy, thì giao diện người dùng cần phải hủy hoạt động của nó bằng cách nào đó.

Có một số khả năng khác mà bạn có thể đặt bằng các đối số. CYCLE sẽ cho phép trình tự quay vòng một lần nữa sau khi nó kết thúc và sau đó chuyển đến MINVALUE. Bạn thậm chí có thể khởi động lại nó một cách rõ ràng ở giữa một chuỗi bằng cách đặt cho nó một giá trị RESTART.

Bạn cũng có thể cung cấp cho nó một CACHE, chẳng hạn như bạn có thể yêu cầu 50 số thứ tự cùng một lúc và nó cập nhật bảng thứ tự hệ thống cứ sau 50 số một lần, có thể nhanh hơn, nhưng nó cũng tăng thêm rủi ro nếu mất điện. , vì những số này không thể được sử dụng lại

Điều cuối cùng đáng chú ý trong thủ tục được lưu trữ này là bạn có thể lấy thông tin (siêu dữ liệu) về các chuỗi của bạn từ chế độ xem hệ thống được gọi là sys.sequences. Nó chứa các thông tin sau.


Một số cột hữu ích mà bạn có thể muốn đọc và chuyển tải đến người dùng là Minimum_value, Maximum_value và current_value.


Nếu bạn quan tâm, các trang sau trên MSDN có thông tin rất hữu ích về trình tự.

Số trình tự
mô tả các trình tự và có các ví dụ rất tốt để sử dụng điển hình

TẠO SEQUENCE (Giao dịch-SQL)

ALTER SEQUENCE (Giao dịch-SQL)

GIÁ TRỊ TIẾP THEO CHO (Transact-SQL)

sys.sequences (Transact-SQL)
Mô tả siêu dữ liệu mà bạn có thể truy vấn trên các chuỗi của mình


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách lưu cơ sở dữ liệu làm mẫu trong Access 2016

  2. Giải pháp thay thế cho DCount và DLookup với MS SQL Server Backend

  3. Chỉ mục ảnh hưởng đến hiệu suất cơ sở dữ liệu như thế nào?

  4. Cách thiết lập chỉ mục bảng trong cơ sở dữ liệu

  5. Tìm tất cả các truy vấn sử dụng một bảng cụ thể