Überlegungen zu Ledgers und Einschränkungen

Gilt für: SQL Server 2022 (16.x) Azure SQL-DatenbankAzure 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.

Ü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 bei Sachtabellen 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 auf ALTER 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 Option ONLINE festgelegt wurde.
  • INSERT- und UPDATE-Anweisungen können nicht auf die GENERATED ALWAYS-Spalten verweisen. Jeder Versuch, Werte direkt in diese Spalten einzufügen, wird blockiert.
  • UPDATETEXT und WRITETEXT 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
    • Trigger
    • 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.