Bạn cần cung cấp tên của bảng lịch sử để duy trì tính liên tục của dữ liệu khi tắt và bật phiên bản hệ thống. Hành vi này được đề cập trong tài liệu cho ALTER TABLE :
Nếu bạn không sử dụng đối số HISTORY_TABLE, hệ thống sẽ tạo bảng lịch sử mới khớp với lược đồ của bảng hiện tại, tạo liên kết giữa hai bảng và cho phép hệ thống ghi lại lịch sử của từng bản ghi trong bảng hiện tại trong bảng hiện tại trong bảng lịch sử.
Đây là một bản demo. Tôi sẽ tạo bảng ví dụ từ tài liệu:
CREATE TABLE dbo.Employee
(
[EmployeeID] int NOT NULL PRIMARY KEY CLUSTERED
, [Name] nvarchar(100) NOT NULL
, [Position] varchar(100) NOT NULL
, [Department] varchar(100) NOT NULL
, [Address] nvarchar(1024) NOT NULL
, [AnnualSalary] decimal (10,2) NOT NULL
, [ValidFrom] datetime2 (2) GENERATED ALWAYS AS ROW START
, [ValidTo] datetime2 (2) GENERATED ALWAYS AS ROW END
, PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON);
Điều này dẫn đến một bảng lịch sử có tên MSSQL_TemporalHistoryFor_1253579504
. Bây giờ tôi sẽ vô hiệu hóa và kích hoạt phiên bản hệ thống:
ALTER TABLE dbo.Employee SET (SYSTEM_VERSIONING = OFF);
ALTER TABLE dbo.Employee SET (SYSTEM_VERSIONING = ON);
Và tôi đang ở trong tình huống chính xác của bạn:
Bây giờ tôi sẽ dọn dẹp mọi thứ:
ALTER TABLE dbo.Employee SET (SYSTEM_VERSIONING = OFF);
DROP TABLE dbo.Employee;
DROP TABLE dbo.MSSQL_TemporalHistoryFor_1253579504;
DROP TABLE dbo.MSSQL_TemporalHistoryFor_1253579504_D0055BB4;
Sau đó tạo bảng với tên bảng lịch sử cụ thể:
CREATE TABLE dbo.Employee
(
[EmployeeID] int NOT NULL PRIMARY KEY CLUSTERED
, [Name] nvarchar(100) NOT NULL
, [Position] varchar(100) NOT NULL
, [Department] varchar(100) NOT NULL
, [Address] nvarchar(1024) NOT NULL
, [AnnualSalary] decimal (10,2) NOT NULL
, [ValidFrom] datetime2 (2) GENERATED ALWAYS AS ROW START
, [ValidTo] datetime2 (2) GENERATED ALWAYS AS ROW END
, PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.EmployeeHistory));
Sau đó tắt và bật phiên bản hệ thống, nhưng tiếp tục chỉ định tên bảng lịch sử:
ALTER TABLE dbo.Employee SET (SYSTEM_VERSIONING = OFF);
ALTER TABLE dbo.Employee SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.EmployeeHistory));
Lưu ý: trong tình huống cụ thể của bạn, bạn sẽ có thể sử dụng cú pháp này để "gắn lại" một bảng lịch sử bị mất vào bảng cơ sở của bạn
Không có bảng phụ:
Mang đi
Luôn chỉ định rõ ràng tên bảng lịch sử khi tạo bảng tạm thời hoặc cho phép phiên bản hệ thống.
Các tài liệu MS hiện gọi điều này cụ thể trên Dừng phiên bản hệ thống trên trang Bảng tạm thời được phiên bản hệ thống :
Khi bật lại phiên bản hệ thống, đừng quên chỉ định đối số HISTORY_TABLE. Không làm như vậy sẽ dẫn đến một bảng lịch sử mới được tạo và liên kết với bảng hiện tại. Bảng lịch sử ban đầu vẫn sẽ tồn tại như một bảng bình thường, nhưng sẽ không được liên kết với bảng hiện tại.