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

“Đảo ngược hàng” trong SQL Server là gì?

Trong SQL Server, rowversion là một kiểu dữ liệu hiển thị các số nhị phân duy nhất, được tạo tự động trong cơ sở dữ liệu. Nó cho phép bạn đóng dấu phiên bản các hàng trong bảng với một giá trị duy nhất. Điều này giúp duy trì tính toàn vẹn của cơ sở dữ liệu khi nhiều người dùng cập nhật các hàng cùng một lúc.

Mỗi cơ sở dữ liệu SQL Server có một bộ đếm được tăng dần cho mỗi thao tác chèn hoặc cập nhật được thực hiện trên bảng có chứa cột có rowversion loại dữ liệu (hoặc dấu thời gian của nó từ đồng nghĩa, được gắn cờ vì không dùng nữa).

Nếu bảng chứa chuyển đổi hàng (hoặc dấu thời gian ), bất kỳ khi nào một hàng được chèn hoặc cập nhật, giá trị của chuyển đổi hàng được đặt thành giá trị chuyển đổi hàng hiện tại. Điều này đúng, ngay cả khi UPDATE tuyên bố không dẫn đến bất kỳ thay đổi nào đối với dữ liệu.

Ví dụ 1 - Tạo Bảng với Cột chuyển đổi hàng

Dưới đây là ví dụ về cách tạo bảng với đảo ngược cột.

CREATE DATABASE Test_rowversion;
USE Test_rowversion;
CREATE TABLE Pet (
    PetId int IDENTITY(1,1) PRIMARY KEY, 
    PetName varchar(255),
    VersionStamp rowversion
    );

SELECT @@DBTS AS Before;

INSERT INTO Pet (PetName)
VALUES ('Max');

SELECT @@DBTS AS After;

Kết quả:

Các lệnh
Commands completed successfully.
Changed database context to 'Test_rowversion'.
Commands completed successfully.
+--------------------+
| Before             |
|--------------------|
| 0x00000000000007D0 |
+--------------------+
(1 row affected)
(1 row affected)
+--------------------+
| After              |
|--------------------|
| 0x00000000000007D1 |
+--------------------+
(1 row affected)

Hãy xem các giá trị “Trước” và “Sau” trong kết quả. Điều này đại diện cho chuyển đổi hàng hóa hiện tại giá trị.

Trong trường hợp này, tôi đã tạo một cơ sở dữ liệu và bảng mới và chuyển đổi hàng giá trị bắt đầu ở 0x00000000000007D0 . Sau khi tôi chèn một hàng, chuyển đổi hàng hóa đã được tăng lên thành 0x00000000000007D1 .

Ví dụ 2 - Cập nhật

Như đã đề cập, lộn xộn giá trị cũng được tăng lên khi bạn cập nhật.

Ví dụ:

SELECT * FROM Pet;

UPDATE Pet
SET PetName = 'Maxine'
WHERE PetId = 1;

SELECT * FROM Pet;

Kết quả:

+---------+-----------+--------------------+
| PetId   | PetName   | VersionStamp       |
|---------+-----------+--------------------|
| 1       | Max       | 0x00000000000007D1 |
+---------+-----------+--------------------+
(1 row affected)
(1 row affected)
+---------+-----------+--------------------+
| PetId   | PetName   | VersionStamp       |
|---------+-----------+--------------------|
| 1       | Maxine    | 0x00000000000007D2 |
+---------+-----------+--------------------+
(1 row affected)

Tại đây, tôi cập nhật PetName và cột VersionStamp cột ( đảo hàng ) được tăng lên thành 0x00000000000007D2 .

Ví dụ 3 - Cập nhật Không có Thay đổi

Một trong những điều thú vị về lộn xộn là nó được tăng lên trên tất cả UPDATE hoạt động ngay cả khi không có thay đổi nào diễn ra .

Ví dụ:nếu tôi chạy lại mã trước đó, giá trị của VersionStamp cột vẫn thay đổi, mặc dù không có thay đổi nào diễn ra:

SELECT * FROM Pet;

UPDATE Pet
SET PetName = 'Maxine'
WHERE PetId = 1;

SELECT * FROM Pet;

Kết quả:

+---------+-----------+--------------------+
| PetId   | PetName   | VersionStamp       |
|---------+-----------+--------------------|
| 1       | Maxine    | 0x00000000000007D2 |
+---------+-----------+--------------------+
(1 row affected)
(1 row affected)
+---------+-----------+--------------------+
| PetId   | PetName   | VersionStamp       |
|---------+-----------+--------------------|
| 1       | Maxine    | 0x00000000000007D3 |
+---------+-----------+--------------------+
(1 row affected)

Giá trị của PetIdPetName các cột không thay đổi, nhưng VersionStamp cột đã được tăng lên.

Ví dụ 4 - Loại dữ liệu dấu thời gian

Dấu thời gian kiểu dữ liệu là từ đồng nghĩa với rowversion . Tuy nhiên, dấu thời gian là một trong những kiểu dữ liệu đã được gắn cờ để không dùng nữa trong phiên bản SQL Server trong tương lai. Không có gì ngạc nhiên khi Microsoft khuyến nghị tránh sử dụng tính năng này trong công việc phát triển mới và lên kế hoạch sửa đổi các ứng dụng hiện đang sử dụng tính năng này.

Do đó, nếu bạn gặp cơ sở dữ liệu sử dụng dấu thời gian loại dữ liệu, bạn có thể muốn nghĩ về việc thay đổi nó thành chuyển đổi hàng hóa .

Chỉ nhằm mục đích trình diễn, đây là bản sửa đổi của ví dụ đầu tiên để sử dụng dấu thời gian thay vì lộn xộn :

CREATE DATABASE Test_timestamp;
USE Test_timestamp;
CREATE TABLE Pet (
    PetId int IDENTITY(1,1) PRIMARY KEY, 
    PetName varchar(255),
    timestamp
    );

SELECT @@DBTS AS Before;

INSERT INTO Pet (PetName)
VALUES ('Max');

SELECT @@DBTS AS After;

Kết quả:

Các lệnh
Commands completed successfully.
Changed database context to 'Test_timestamp'.
Commands completed successfully.
+--------------------+
| Before             |
|--------------------|
| 0x00000000000007D0 |
+--------------------+
(1 row affected)
(1 row affected)
+--------------------+
| After              |
|--------------------|
| 0x00000000000007D1 |
+--------------------+
(1 row affected)

Và trong khi chúng tôi đang xem xét, đây là ví dụ tiếp theo được sửa đổi cho dấu thời gian :

SELECT * FROM Pet;

UPDATE Pet
SET PetName = 'Maxine'
WHERE PetId = 1;

SELECT * FROM Pet;

Kết quả:

+---------+-----------+--------------------+
| PetId   | PetName   | timestamp          |
|---------+-----------+--------------------|
| 1       | Max       | 0x00000000000007D1 |
+---------+-----------+--------------------+
(1 row affected)
(1 row affected)
+---------+-----------+--------------------+
| PetId   | PetName   | timestamp          |
|---------+-----------+--------------------|
| 1       | Maxine    | 0x00000000000007D2 |
+---------+-----------+--------------------+
(1 row affected)

Bạn có thể nhận thấy rằng tôi không thực sự cung cấp tên cho dấu thời gian cột. Nếu bạn không chỉ định tên cột, Công cụ cơ sở dữ liệu máy chủ SQL sẽ tạo dấu thời gian tên cột.

Tuy nhiên, lộn xộn không cho phép cú pháp này, vì vậy bạn sẽ cần chỉ định tên cột khi sử dụng rowversion .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng SQL Server làm kho lưu trữ hình ảnh

  2. Mô phỏng CONNECT BY PRIOR của Oracle trong SQL Server

  3. Cách bật tính năng nén trên bảng hiện có trong SQL Server (T-SQL)

  4. 2 cách liệt kê tất cả các hàm có giá trị bảng trong cơ sở dữ liệu SQL Server

  5. Khôi phục cơ sở dữ liệu máy chủ SQL (T-SQL)