Tại sao tôi có nhiều bảng lịch sử tạm thời (không liên kết)?


8

Tôi đã thiết lập một bằng chứng về hệ thống khái niệm có phần cuối SQL Server 2017.
Hệ thống sử dụng các bảng tạm thời để ghi lại cấu hình tài sản và theo dõi các thay đổi theo thời gian.
Tôi có một bảng Dữ liệu được liên kết với bảng lịch sử, hãy gọi nó là dbo.MSSQL_T tạmHistoryFor_12345678900.

Càng xa càng tốt. Tôi có hai vấn đề:

Hôm nay tôi đã tắt phiên bản trên bàn để tôi có thể thêm một cột được tính toán. Điều này đã được thực hiện và bật lại mà không có lỗi.

Bây giờ tôi thấy rằng tôi không thể truy vấn bất kỳ dữ liệu lịch sử nào trước khi thay đổi. Dữ liệu mới đang được thêm vào lịch sử, nhưng không có gì trước đó.

Nhìn vào bên trong SSMS, bây giờ tôi có thể thấy có nhiều bảng lịch sử, tất cả đều có cùng tên nhưng có hậu tố hex, ví dụ: dbo.MSQuery_T tạmHistoryFor_12345678900_A0B1C2D3. Chúng không được liên kết bên dưới bảng dữ liệu chính. Họ chỉ nổi xung quanh bên trong cơ sở dữ liệu. Khi tôi truy vấn sys.tables, chúng không được hiển thị dưới dạng bảng lịch sử và không được liên kết với bảng dữ liệu chính.

Các bảng này có chứa dữ liệu lịch sử bị thiếu.

Do đó, những câu hỏi tôi có là:

  • Những bảng bổ sung này đại diện cho cái gì?
  • Chúng được tạo ra như thế nào?
  • Có cách nào để tái hiện những điều này vào chuỗi lịch sử chính để tôi có thể lấy lại báo cáo lịch sử của mình không?

Thật là bực bội vì vậy bất kỳ trợ giúp nào bạn có thể cung cấp sẽ được nhận một cách biết ơn. Cảm ơn.


1
Nó có thể hữu ích nếu bạn cung cấp các lệnh bạn đã chạy trước khi bạn vào trạng thái này.
LowlyDBA

Câu trả lời:


8

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:

nhập mô tả hình ảnh ở đây


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ụ:

nhập mô tả hình ảnh ở đây

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.