Đây vẫn là một vấn đề rất phổ biến giữa nhiều nhà phát triển và ứng dụng bất kể kích thước.
Thật không may, các đề xuất ở trên không khắc phục được tất cả các tình huống, ví dụ như Lưu trữ được chia sẻ, bạn không thể dựa vào máy chủ của mình để đặt tham số khởi động -t272.
Ngoài ra, nếu bạn có các bảng hiện có sử dụng các cột nhận dạng này cho các khóa chính, thì việc bỏ các cột đó và tạo lại các cột mới để sử dụng giải pháp trình tự BS là một nỗ lực rất lớn. Cách giải quyết Sequence chỉ tốt nếu bạn đang thiết kế các bảng mới từ đầu trong SQL 2012+
Điểm mấu chốt là, nếu bạn đang sử dụng Sql Server 2008R2, thì hãy TRÊN NÓ. Nghiêm túc, ở lại trên nó. Cho đến khi Microsoft thừa nhận rằng họ đã giới thiệu một lỗi HUGE, vẫn còn tồn tại ngay cả trong Sql Server 2016, thì chúng ta không nên nâng cấp cho đến khi họ sở hữu nó và FIX IT.
Microsoft đã giới thiệu một thay đổi đột phá, tức là họ đã phá vỡ một API hoạt động không còn hoạt động như thiết kế, do thực tế là hệ thống của họ quên danh tính hiện tại của họ khi khởi động lại. Bộ nhớ cache hoặc không có bộ đệm, điều này là không thể chấp nhận được và nhà phát triển Microsoft có tên Bryan cần sở hữu nó, thay vì nói với thế giới rằng đó là "theo thiết kế" và "tính năng". Chắc chắn, bộ nhớ đệm là một tính năng, nhưng mất theo dõi danh tính tiếp theo sẽ là gì, KHÔNG PHẢI LÀ ĐẶC ĐIỂM. Đó là một BUG bực bội !!!
Tôi sẽ chia sẻ cách giải quyết mà tôi đã sử dụng, bởi vì DB của tôi đang ở trên các máy chủ Shared Hosting, đồng thời, tôi sẽ không bỏ và tạo lại các cột Chính của mình, đó sẽ là một PITA khổng lồ.
Thay vào đó, đây là bản hack đáng xấu hổ của tôi (nhưng không đáng xấu hổ như lỗi POS này mà microsoft đã giới thiệu).
Hack / Sửa lỗi:
Trước các lệnh chèn của bạn, chỉ cần kiểm tra lại danh tính của bạn trước mỗi lần chèn. Khắc phục sự cố này chỉ được khuyến nghị nếu bạn không có quyền kiểm soát của quản trị viên đối với phiên bản Sql Server của bạn, nếu không tôi khuyên bạn nên khởi động lại khi khởi động lại máy chủ.
declare @newId int -- where int is the datatype of your PKey or Id column
select @newId = max(YourBuggedIdColumn) from YOUR_TABLE_NAME
DBCC CheckIdent('YOUR_TABLE_NAME', RESEED, @newId)
Chỉ cần 3 dòng ngay trước khi chèn của bạn, và bạn nên đi. Nó thực sự sẽ không ảnh hưởng đến hiệu suất nhiều, tức là nó sẽ không được chú ý.
Chúc may mắn.
order by ReceiptNo
vào truy vấn của bạn là những hồ sơ thực sự không có? Bạn có chắc chắn khi hồ sơ được chèn không có lỗi? Nếu một bản ghi cố gắng để được chèn và không nhận dạng sẽ tăng lên, điều tương tự nếu các bản ghi bị xóa. Nếu hồ sơ bị xóa,ReceiptNo
không thiết lập lại. Bạn có thể đăng bảng tạo choFee
bảng?