Überlegungen zu Ledgers und Einschränkungen
Gilt für: SQL Server 2022 (16.x) Azure SQL-Datenbank Azure SQL Managed Instance
Bei der Arbeit mit Ledgertabellen sind einige Überlegungen und Einschränkungen zu beachten, die aus der Art der Systemversionsverwaltung und den unveränderlichen Daten resultieren.
Allgemeine Überlegungen und Einschränkungen
Beachten Sie Folgendes, wenn Sie mit Ledger arbeiten.
- Eine Ledgerdatenbank, eine Datenbank mit aktivierter Ledgereigenschaft, kann nicht in eine reguläre Datenbank mit deaktivierter Ledgereigenschaft konvertiert werden.
- Die automatische Generierung und Speicherung von Datenbankdigests ist derzeit in Azure SQL-Datenbank verfügbar, wird jedoch in SQL Server nicht unterstützt.
- Die automatisierte Digestverwaltung mit Ledgertabellen mithilfe von unveränderlichen Azure Storage-Blobs bietet Benutzern nicht die Möglichkeit, lokal redundante Speicherkonten (LRS) zu verwenden.
- Wenn eine Ledgerdatenbank erstellt wird, sind alle neuen Tabellen, die standardmäßig (ohne Angabe der
APPEND_ONLY = ON
-Klausel) in der Datenbank erstellt werden, aktualisierbare Ledgertabellen. Ledgertabellen, die nur Anfügevorgänge unterstützen, lassen sich mithilfe derAPPEND_ONLY = ON
-Klausel von CREATE TABLE-Anweisungen (Transact-SQL) erstellen. - Eine Transaktion kann bis zu 200 Ledgertabellen aktualisieren.
Überlegungen und Einschränkungen zu Ledgertabellen
- Bestehende Tabellen in einer Datenbank, die keine Ledgertabellen sind, können nicht in Ledgertabellen umgewandelt werden. Weitere Informationen finden Sie unter Migrieren von Daten von regulären Tabellen zu Ledgertabellen.
- Nachdem eine Ledgertabelle erstellt wurde, kann sie nicht in eine Tabelle umgewandelt werden, die keine Ledgertabelle ist.
- Das Löschen älterer Daten in Ledgertabellen, die nur Anfügevorgänge unterstützen, oder in der Verlaufstabelle aktualisierbarer Ledgertabellen wird nicht unterstützt.
TRUNCATE TABLE
wird nicht unterstützt.- Wenn eine aktualisierbare Ledgertabelle erstellt wird, werden der Ledgertabelle vier Spalten des Typs GENERATED ALWAYS hinzugefügt. Eine Ledgertabelle, die nur Anfügevorgänge unterstützt, fügt der Ledgertabelle zwei Spalten hinzu. Diese neuen Spalten werden von der maximal unterstützten Anzahl von Spalten in Azure SQL-Datenbank (1.024) abgezogen.
- In-Memory-Tabellen werden nicht unterstützt.
- Sparsespaltensätze werden nicht unterstützt.
- SWITCH IN/OUT-Partition wird nicht unterstützt.
- DBCC CLONEDATABASE wird nicht unterstützt.
- Ledgertabellen können keine Volltextindizes enthalten.
- Ledgertabellen können keine Graphtabellen sein.
- Ledgertabellen können keine Dateitabellen sein.
- Ledgertabellen dürfen keinen nicht gruppierten Rowstore-Index haben, wenn sie über einen gruppierten Columnstore-Index verfügen.
- Die Änderungsnachverfolgung ist nicht in der Verlaufstabelle, aber in Ledgertabellen zulässig.
- Change data capture ist nicht in der Verlaufstabelle, aber in Ledger-Tabellen zulässig.
- Die Transaktionsreplikation wird für Ledgertabellen nicht unterstützt.
- Die Datenbankspiegelung wird nicht unterstützt.
- Azure Synapse Link wird unterstützt, aber nur für die Hauptbuchtabelle, nicht für die Verlaufstabelle.
- Ändern Sie den Digest-Pfad manuell nach einer systemeigenen Wiederherstellung einer Datenbanksicherung in ein Azure SQL Managed Instance.
- Ändern Sie den Digest-Pfad manuell, nachdem ein verwaltete Instanz Link zu einem Azure SQL Managed Instance erstellt wurde.
- SQL-Datensynchronisierung wird für Ledgertabellen nicht unterstützt.
Nicht unterstützte Datentypen
- XML
- SqlVariant
- Benutzerdefinierter Datentyp
- FILESTREAM
Einschränkungen der temporalen Tabelle
Die aktualisierbaren Ledger-Tabellen basieren auf der Technologie der temporalen Tabellen und erben die meisten Einschränkungen, aber nicht alle. Unten finden Sie eine Liste der Einschränkungen, die sie von temporalen Tabellen erben.
- Falls der Name einer Verlaufstabelle während der Erstellung der Verlaufstabelle angegeben wird, müssen Sie das Schema und den Tabellennamen sowie den Namen der Ledgeransicht angeben.
- Standardmäßig ist die Verlaufstabelle PAGE -komprimiert.
- Falls die aktuelle Tabelle partitioniert wurde, kann die Verlaufstabelle in der Standarddateigruppe erstellt werden, da die Partitionierungskonfiguration nicht automatisch von der aktuellen auf die Verlaufstabelle repliziert wird.
- Temporale und Verlaufstabellen können keine DATEITABELLE sein und können Spalten eines beliebigen unterstützten Datentyps außer FILESTREAM enthalten. DATEITABELLE und FILESTREAM ermöglichen die Datenbearbeitung außerhalb von SQL Server, und somit kann die Systemversionsverwaltung nicht garantiert werden.
- Eine Knoten- oder Edgetabelle kann nicht als temporale Tabelle erstellt oder in eine solche geändert werden. Graph wird nicht mit Ledger unterstützt.
- Temporale Tabellen unterstützen zwar Blob Datentypen wie
(n)varchar(max)
,varbinary(max)
,(n)text
undimage
ziehen jedoch signifikante Speicherkosten auf sich und wirken sich aufgrund ihrer Größe auf die Leistung aus. Daher sollten Sie beim Entwerfen Ihres Systems vorsichtig sein, wenn Sie diese Datentypen verwenden. - Die Verlaufstabelle muss in derselben Datenbank wie die aktuelle Tabelle erstellt werden. Temporale Abfragen über Linked Server (Verbindungsserver) werden nicht unterstützt.
- Die Verlaufstabelle darf keine Einschränkungen aufweisen (Primärschlüssel-, Fremdschlüssel-, Tabellen- oder Spalteneinschränkungen).
- Die Onlineoption (
WITH (ONLINE = ON
) hat keine Auswirkungen aufALTER TABLE ALTER COLUMN
, wenn es sich um eine temporale Tabelle mit Systemversionsverwaltung handelt.ALTER COLUMN
wird nicht im Modus „online“ durchgeführt. Dies gilt unabhängig vom Wert, der für die OptionONLINE
festgelegt wurde. INSERT
- undUPDATE
-Anweisungen können nicht auf die GENERATED ALWAYS-Spalten verweisen. Jeder Versuch, Werte direkt in diese Spalten einzufügen, wird blockiert.UPDATETEXT
undWRITETEXT
werden nicht unterstützt.- Trigger für die Verlaufstabelle sind nicht zulässig.
- Die Verwendung der Replikationstechniken ist eingeschränkt:
- Always On: wird voll unterstützt
- Momentaufnahme, Zusammenführen und Transaktionsreplikation: Für temporale Tabellen nicht unterstützt
- Eine Verlaufstabelle kann nicht als aktuelle Tabelle in einer Kette von Verlaufstabellen konfiguriert werden.
- Die folgenden Objekte oder Eigenschaften werden beim Erstellen der Verlaufstabelle nicht aus der aktuellen Tabelle in die Verlaufstabelle repliziert:
- Periodendefinition
- Identitätsdefinition
- Indizes
- Statistik
- Check-Einschränkungen
- Auslöser
- Partitionierungskonfiguration
- Berechtigungen
- Prädikate für die Sicherheit auf Zeilenebene
Überlegungen zu Schemaänderungen
Spalten hinzufügen
Das Hinzufügen von NULL-Werte zulassenden Spalten wird unterstützt. Das Hinzufügen nicht löschbarer Spalten wird nicht unterstützt. Ledger ist so konzipiert, dass NULL-Werte beim Berechnen des Hashs einer Zeilenversion ignoriert werden. Wenn eine NULL-Werte zulassende Spalte hinzugefügt wird, ändert Ledger darauf basierend das Schema der Ledger- und Verlaufstabellen, um die neue Spalte einzubeziehen, was sich jedoch nicht auf die Hashs der vorhandenen Zeilen auswirkt. Das Hinzufügen von Spalten in Ledgertabellen wird in sys.ledger_column_history erfasst.
Löschen von Spalten und Tabellen
Normalerweise werden beim Löschen von Spalten und Tabellen die zugrunde liegenden Daten vollständig aus der Datenbank gelöscht, und es ist völlig inkompatibel mit der Ledgerfunktionalität, die fordert, dass Daten unveränderlich sein müssen. Anstatt die Daten zu löschen, benennt Ledger die zu löschenden Objekte einfach um, sodass sie logisch aus dem Benutzerschema entfernt werden, aber physisch in der Datenbank verbleiben. Alle gelöschten Spalten werden auch aus dem Ledgertabellenschema ausgeblendet, sodass sie für die Benutzeranwendung unsichtbar sind. Die Daten solcher gelöschten Objekte bleiben jedoch für den Ledgerprüfungsprozess verfügbar und ermöglichen den Benutzern, alle Verlaufsdaten über die entsprechenden Ledgeransichten einzusehen. Das Löschen von Spalten in Ledgertabellen wird in sys.ledger_column_history erfasst. Das Löschen einer Ledgertabelle wird in sys.ledger_table_history erfasst. Gelöschte Ledgertabellen und ihre abhängigen Objekte werden in Systemkatalogansichten als gelöscht markiert und umbenannt:
- Gelöschte Ledgertabellen werden durch Festlegen von
is_dropped_ledger_table
in sys.tables gekennzeichnet und mithilfe des folgenden Formats umbenannt:MSSQL_DroppedLedgerTable_<dropped_ledger_table_name>_<GUID>
. - Gelöschte Verlaufstabellen für aktualisierbare Ledgertabellen werden mithilfe des folgenden Formats umbenannt:
MSSQL_DroppedLedgerHistory_<dropped_history_table_name>_<GUID>
. - Gelöschte Ledgeransichten werden durch Festlegen von
is_dropped_ledger_view
in sys.views gekennzeichnet und mithilfe des folgenden Formats umbenannt:MSSQL_DroppedLedgerView_<dropped_ledger_view_name>_<GUID>
.
Hinweis
Der Name der verworfenen Sachtabellen, Verlaufstabellen und Ledger-Ansichten kann abgeschnitten werden, wenn die Länge der umbenannten Tabelle oder Ansicht 128 Zeichen überschreitet.
Ändern von Spalten
Alle Änderungen, die sich nicht auf die zugrunde liegenden Daten einer Ledgertabelle auswirken, werden ohne spezielle Behandlung unterstützt, da sie die in Ledger erfassten Hashes nicht beeinflussen. Zu diesen Änderungen zählen die folgenden:
- Ändern der NULL-Zulässigkeit
- Sortierung für Unicode-Zeichenfolgen
- Die Länge von Spalten mit variabler Länge
Alle Vorgänge, die sich auf das Format vorhandener Daten auswirken könnten, z. B. das Ändern des Datentyps, werden jedoch nicht unterstützt.