テンポラル テーブルがあり、トランザクション レプリケーションを使用してレプリケートしたいと考えています。履歴テーブルには、トランザクション レプリケーションに必要な主キーを含めることはできません。GENERATED ALWAYS AS ROW START
現在のテーブルをレプリケートしようとすると、またはGENERATED ALWAYS AS ROW END
列に挿入できないため、レプリケーションが失敗します。
3 に答える
Microsoft ドキュメントには次のように記載されています。
スナップショットとトランザクション レプリケーション: テンポラルが有効になっていない 1 つのパブリッシャーと、テンポラルが有効になっている 1 つのサブスクライバーでのみサポートされます。
いくつかのダミー データを含むテンポラル テーブルの例を次に示します。
CREATE TABLE [dbo].[TemporalTest]
(
[EmployeeID] CHAR(6) NOT NULL,
[EmployeeName] VARCHAR(50) NOT NULL,
[EFF_STRT_TS] DATETIME2(7) GENERATED ALWAYS AS ROW START NOT NULL,
[EFF_END_TS] DATETIME2(7) GENERATED ALWAYS AS ROW END NOT NULL,
PERIOD FOR SYSTEM_TIME ([EFF_STRT_TS],[EFF_END_TS]),
CONSTRAINT [PK_TemporalTest] PRIMARY KEY CLUSTERED ([EmployeeID] ASC),
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[TemporalTest_HIST]));
GO
INSERT INTO [dbo].[TemporalTest]
([EmployeeID],[EmployeeName])
VALUES
('000001','Jane Doe'),
('000002','John Smith'),
('000003','John Deer'),
('000004','Dear John')
DELETE FROM [dbo].[TemporalTest]
WHERE [EmployeeID] = '000003'
UPDATE [dbo].[TemporalTest]
SET [EmployeeName] = 'Jane Smith'
WHERE [EmployeeID] = '000001'
複製する前に、 をオフにしSYSTEM_VERSIONING
ます。
ALTER TABLE [dbo].[TemporalTest]
SET (SYSTEM_VERSIONING = OFF);
トランザクション レプリケーションを設定し、期間列[EFF_STRT_TS]
とを除外します[EFF_END_TS]
。レプリケートされた側で、期間列を追加します。
ALTER TABLE [dbo].[TemporalTest]
ADD [EFF_STRT_TS] DATETIME2(7) NULL,
[EFF_END_TS] DATETIME2(7) NULL
SSIS を使用[TemporalTest_HIST]
して、パブリッシャーからサブスクライバーに履歴テーブルをコピーします。また、SSIS を使用して、現在の[TemporalTest]
テーブルをパブリッシャーからサブスクライバーに上書きして、期間列の値が正確に一致し、null にならないようにします。その後、サブスクライバー側の列を変更して期間列を作成し、NOT NULL
それらをPERIOD FOR SYSTEM_TIME
.
ALTER TABLE [dbo].[TemporalTest]
ALTER COLUMN [EFF_STRT_TS] DATETIME2(7) NOT NULL
ALTER TABLE [dbo].[TemporalTest]
ALTER COLUMN [EFF_END_TS] DATETIME2(7) NOT NULL
ALTER TABLE [dbo].[TemporalTest]
ADD PERIOD FOR SYSTEM_TIME ([EFF_STRT_TS],[EFF_END_TS])
パブリッシャー側とサブスクライバー側の両方で、 を設定しSYSTEM_VERSIONING = ON
ます。
ALTER TABLE [dbo].[TemporalTest]
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[TemporalTest_HIST]));
今後、パブリッシャーとサブスクライバーはそれぞれ、システム バージョン管理された独自のテンポラル テーブルを維持します。テンポラル テーブル構造全体がレプリケートされないため、レプリケーションにかかる時間によっては期間列が正確に整列しない場合があります。
現在のテーブルのみをレプリケートする必要がありました (Microsoft が想定したシナリオとは逆です)。「現在の」テーブルに非テンポラル インデックス付きビューを作成し、インデックス付きビューをレプリケートしました。ビューでシステム バージョン管理された列をスキップしました (それが本当に重要だとは思いません)。