台帳の考慮事項と制限事項
適用対象: SQL Server 2022 (16.x) Azure SQL データベース Azure SQL Managed Instance
台帳テーブルを使用する場合は、システムのバージョン管理およ不変データの性質の上、注意すべき考慮事項と制約がいくつかあります。
一般的な考慮事項と制限事項
台帳を使用する場合は、次のことを考慮してください。
- 台帳データベース (台帳プロパティがオンに設定されているデータベース) は、台帳プロパティがオフに設定されている通常のデータベースに変換できません。
- データベース ダイジェストの自動生成と保存は現在、Azure SQL Database で利用できますが、SQL Server ではサポートされていません。
- Azure Storage の不変 BLOB を使用した台帳テーブルによる自動ダイジェスト管理では、ローカル冗長ストレージ (LRS) アカウントを使用できません。
- 台帳データベースを作成するとき、既定で (
APPEND_ONLY = ON
句を指定せずに) データベース上に新たに作成されるテーブルはすべて、更新可能な台帳テーブルです。 追加専用の台帳テーブルを作成するには、CREATE TABLE (Transact-SQL) ステートメントのAPPEND_ONLY = ON
句を使用します。 - 1 回のトランザクションで最大 200 個の台帳テーブルを更新できます。
台帳テーブルの考慮事項と制限事項
- 台帳テーブルではないデータベースの既存のテーブルは、台帳テーブルに変換できません。 詳細については、「標準テーブルから台帳テーブルへのデータの移行」を参照してください。
- 作成した台帳テーブルを、台帳テーブル以外のテーブルに変換することはできません。
- 追加専用の台帳テーブル、および更新可能な台帳テーブルの履歴テーブルの古いデータの削除はサポートしていません。
TRUNCATE TABLE
はサポートされていません。- 更新可能な台帳テーブルが作成されると、4 つの GENERATED ALWAYS 列が台帳テーブルに追加されます。 追加専用の台帳テーブルでは、2 つの列が台帳テーブルに追加されます。 これらの新しい列は、Azure SQL Database でサポートしている最大列数 (1,024) に対してカウントされます。
- メモリ内テーブルはサポートしていません。
- スパース列セットはサポートしていません。
- SWITCH IN/OUT パーティションはサポートされていません。
- DBCC CLONEDATABASE はサポートされていません。
- 台帳テーブルではフルテキスト インデックスを使用できません。
- 台帳テーブルをグラフ テーブルにすることはできません。
- 台帳テーブルを FileTable にはできません。
- 台帳テーブルでは、クラスター化列ストア インデックスが存在する場合、行ストア非クラスター化インデックスを作成できません。
- 履歴テーブルでは変更の追跡は許可されませんが、台帳テーブルでは許可されます。
- 履歴テーブルでは変更データ キャプチャは許可されていませんが、レジャーテーブルでは許可されています。
- トランザクション レプリケーションは、台帳テーブルではサポートされていません。
- データベース ミラーリングはサポートされていません。
- Azure Synapse Link はサポートされていますが、履歴テーブルではなく、レジャーテーブルに対してのみサポートされます。
- データベース バックアップを Azure SQL Managed Instance にネイティブに復元した後、ダイジェスト パスを手動で変更します。
- Azure SQL Managed Instance への Managed Instance リンクが作成された後、ダイジェスト パスを手動で変更します。
- SQL データ同期は、レジャー テーブルではサポートされていません。データ
サポートされていないデータ型
- XML
- SqlVariant
- ユーザー定義データ型
- FILESTREAM
テンポラル テーブルの制限事項
更新可能な台帳テーブルは、テンポラル テーブルのテクノロジに基づいており、制限の大部分を継承しますが、すべてではありません。 テンポラル テーブルから継承される制限事項の一覧を次に示します。
- 履歴テーブルの作成時に履歴テーブルの名前を指定する場合は、スキーマとテーブルの名前、また台帳ビューの名前を指定する必要があります。
- 履歴テーブルには既定では、 PAGE 圧縮します。
- 現在のテーブルがパーティション分割されている場合、パーティション分割構成が現在のテーブルから履歴テーブルに自動的にレプリケートされないため、履歴テーブルは既定のファイル グループに作成されます。
- テンポラル テーブルと履歴テーブルは FILETABLE にすることができず、FILESTREAM 以外のサポートされているデータタイプの列を含む場合があります。 FILETABLE と FILESTREAM を使用すると、SQL Serverの外部でデータを操作できるため、システムのバージョン管理は保証できません。
- ノード テーブルまたはエッジ テーブルは、テンポラル テーブルとして作成することも、テンポラル テーブルに変更することもできません。 グラフは台帳ではサポートされていません。
- テンポラル テーブルでは、
(n)varchar(max)
、varbinary(max)
、(n)text
、image
などの BLOB データ型がサポートされていますが、これらは多大なストレージ コストを発生させ、サイズが大きいためにパフォーマンスに影響を与えます。 そのため、システムの設計時に、これらのデータ型を使用する場合は注意が必要です。 - 履歴テーブルは、現在のテーブルと同じデータベースで作成する必要があります。 Linked Server に対するテンポラル クエリはサポートされていません。
- 履歴テーブルには、制約 (主キー、外部キー、テーブル、または列の制約) を含めることはできません。
- システムでバージョン管理されたテンポラル テーブルの場合、オンライン オプション (
WITH (ONLINE = ON
) はALTER TABLE ALTER COLUMN
に影響を与えません。ONLINE
オプションに指定された値に関係なく、ALTER COLUMN
はオンラインとしては実行されません。 INSERT
およびUPDATE
ステートメントは、GENERATED ALWAYS 列を参照できません。 これらの列に値を直接挿入しようとすると、ブロックされます。UPDATETEXT
とWRITETEXT
はサポートされません。- 履歴テーブルのトリガーは許可されません。
- レプリケーション テクノロジの使用量は制限されています。
- 常にオン: フルにサポートされます。
- スナップショット、マージ、トランザクション レプリケーション: テンポラル テーブルではサポートされていません
- 履歴テーブルは、履歴テーブルのチェーン内で現在のテーブルとして構成することはできません。
- 次のオブジェクトまたはプロパティは、履歴テーブルの作成時に、現在のテーブルから履歴テーブルにレプリケートされません。
- 期間の定義
- ID の定義
- インデックス
- 統計
- CHECK 制約
- トリガー
- パーティション分割構成
- アクセス許可
- 行レベルのセキュリティ述語
スキーマの変更に関する考慮事項
列を追加する
null 許容列の追加がサポートされています。 null 非許容列の追加はサポートされていません。 台帳は、行バージョンのハッシュを計算するときに NULL 値を無視するように設計されています。 これに基づいて、null 許容列が追加されると、台帳により台帳と履歴テーブルのスキーマが変更され、新しい列が含まれるようになりますが、これは既存の行のハッシュには影響しません。 台帳テーブルへの列の追加は、sys.ledger_column_history でキャプチャされます。
列とテーブルの削除
通常、列またはテーブルを削除すると、基になるデータがデータベースから完全に消去され、データを不変にする必要がある台帳機能と基本的に互換性なくなります。 データを削除する代わりに、台帳は、ユーザー スキーマから論理的に削除されるように、削除されるオブジェクトの名前を単に変更しますが、物理的にデータベースに残します。 削除された列は、ユーザー アプリケーションに表示されないように、台帳テーブル スキーマからも非表示になります。 ただし、このような削除されたオブジェクトのデータは台帳検証プロセスで引き続き使用でき、ユーザーは対応する台帳ビューを使用して履歴データを検査できます。 台帳テーブルの列の削除は、sys.ledger_column_history でキャプチャされます。 台帳テーブルの削除は、sys.ledger_table_history でキャプチャされます。 台帳テーブルとその依存オブジェクトの削除は、システム カタログ ビューで削除済みとしてマークされ、名前が変更されます。
- 削除された台帳テーブルは、sys.tables の設定
is_dropped_ledger_table
によって削除済みとしてマークされ、形式MSSQL_DroppedLedgerTable_<dropped_ledger_table_name>_<GUID>
を使用して名前が変更されます。 - 更新可能な台帳テーブルの削除された履歴テーブルの名前は、形式
MSSQL_DroppedLedgerHistory_<dropped_history_table_name>_<GUID>
を使用して変更されます。 - 削除された台帳ビューは、sys.views の設定
is_dropped_ledger_view
によって削除済みとしてマークされ、形式MSSQL_DroppedLedgerView_<dropped_ledger_view_name>_<GUID>
を使用して名前が変更されます。
Note
名前が変更されたテーブルまたはビューの長さが 128 文字を超えると、削除されたレジャーテーブル、履歴テーブル、およびレジャービューの名前が切り捨てられる可能性があります。
列の変更
台帳テーブルの基になるデータに影響を与えない変更は、特別な処理なしでサポートされます。これは、台帳にキャプチャされているハッシュに影響しないためです。 次のような変更です。
- NULL 値の許容の変更
- Unicode 文字列の照合順序
- 可変長列の長さ
ただし、データ型の変更など、既存のデータの形式に影響を与える可能性のある操作はサポートされていません。