なぜ複数の(関連付けられていない)時系列履歴テーブルがあるのですか?


8

SQL Server 2017バックエンドを備えた概念実証システムをセットアップしています。
システムはテンポラルテーブルを使用して、資産構成を記録し、時間の経過に伴う変化を追跡します。
履歴テーブルにリンクされているデータテーブルがあります。それをdbo.MSSQL_TemporaryHistoryFor_12345678900と呼びましょう。

ここまでは順調ですね。私には2つの問題があります。

今日、テーブルのバージョニングをオフにして、計算列を追加できるようにしました。これが行われ、エラーなしで再びオンになりました。

変更前の履歴データをクエリできないことがわかりました。新しいデータが履歴に追加されていますが、事前には何もありません。

SSMSの内部を見ると、すべて同じ名前で16進数のサフィックスが付いた複数の履歴テーブルがあることがわかります(例:dbo.MSSQL_TemporaryHistoryFor_12345678900_A0B1C2D3)。メインデータテーブルの下にリンクされていません。彼らはデータベース内で自分たちだけで浮かんでいるだけです。私がsys.tablesをクエリしたとき、これらは履歴テーブルとして表示されず、メインデータテーブルにリンクされていません。

これらのテーブルには、欠落している履歴データが含まれています。

したがって、私が持っている質問は次のとおりです。

  • これらの追加の表は何を表していますか?
  • 彼らはどのように作成されましたか?
  • これらをメインの履歴チェーンに何らかの形で再リンクして、履歴レポートを取り戻す方法はありますか?

それは非常にイライラするので、あなたが提供できるどんな助けもありがたく受け取られるでしょう。ありがとう。


1
この状態になる前に実行したコマンドを提供すると役立つ場合があります。
LowlyDBA

回答:


8

あなたは、必要にオフバージョン管理やシステムを回したときに、データの連続性を維持するために、履歴テーブルの名前を提供します。この動作は、ALTER TABLEのドキュメントに記載されています。

HISTORY_TABLE引数を使用しない場合、システムは現在のテーブルのスキーマに一致する新しい履歴テーブルを生成し、2つのテーブル間にリンクを作成して、システムが現在のテーブルの各レコードの履歴を履歴テーブル。

こちらがデモです。ドキュメントからサンプルテーブルを作成します。

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);

これにより、という名前の履歴テーブルが作成されMSSQL_TemporalHistoryFor_1253579504ます。次に、システムのバージョン管理を無効にしてから有効にします。

ALTER TABLE dbo.Employee SET (SYSTEM_VERSIONING = OFF);
ALTER TABLE dbo.Employee SET (SYSTEM_VERSIONING = ON);

そして私はあなたの正確な状況にいます:

ここに画像の説明を入力してください


次に、すべてをクリーンアップします。

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;

次に、特定の履歴テーブル名でテーブルを作成します。

 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));  

次に、システムのバージョン管理をオフにしてからオンにしますが、履歴テーブル名を指定し続けます。

ALTER TABLE dbo.Employee SET (SYSTEM_VERSIONING = OFF);
ALTER TABLE dbo.Employee SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.EmployeeHistory));

注:特定の状況では、この構文を使用して、失われた1つの履歴テーブルをベーステーブルに「再アタッチ」できるはずです。

余分なテーブルはありません:

ここに画像の説明を入力してください

お持ち帰り

テンポラルテーブルを作成するとき、またはシステムのバージョン管理を有効にするときは、常に履歴テーブル名を明示的に指定します。

MSのドキュメントでは、特に、システムバージョン付きテンポラルテーブルページでのシステムバージョン管理停止でこれを呼び出しています。

システムのバージョン管理をオンに戻すときは、必ずHISTORY_TABLE引数を指定してください。そうしないと、新しい履歴テーブルが作成され、現在のテーブルに関連付けられます。元の履歴テーブルは通常のテーブルとして存在し続けますが、現在のテーブルには関連付けられません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.