Überlegungen und Einschränkungen zu temporalen TabellenTemporal Table Considerations and Limitations

Gilt für: JaSQL Server JaAzure SQL-Datenbank NeinAzure Synapse Analytics (SQL DW) NeinParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Aufgrund der Eigenschaften der Systemversionsverwaltung gibt es einige Überlegungen und Einschränkungen, derer Sie sich bei der Arbeit mit temporalen Tabellen bewusst sein müssen.There are some considerations and limitations to be aware of when working with temporal tables, due to the nature of system-versioning.

Beachten Sie Folgendes, wenn Sie mit temporalen Tabellen arbeiten:Consider the following when working with temporal tables:

  • Für eine temporale Tabelle muss ein Primärschlüssel definiert sein, um Datensätze zwischen der aktuellen Tabelle und den Verlaufstabellen zu korrelieren. Für die Verlaufstabelle kann kein Primärschlüssel definiert sein.A temporal table must have a primary key defined in order to correlate records between the current table and the history table, and the history table cannot have a primary key defined.

  • Die SYSTEM_TIME-Zeitraumspalten, die verwendet werden, um die Werte SysStartTime und SysEndTime aufzuzeichnen, müssen mit dem Datentyp „datetime2“ definiert sein.The SYSTEM_TIME period columns used to record the SysStartTime and SysEndTime values must be defined with a datatype of datetime2.

  • Falls der Name einer Verlaufstabelle während der Erstellung der Verlaufstabelle angegeben wird, müssen Sie das Schema und den Tabellennamen angeben.If the name of a history table is specified during history table creation, you must specify the schema and table name.

  • Standardmäßig ist die Verlaufstabelle PAGE -komprimiert.By default, the history table is PAGE compressed.

  • Falls die aktuelle Tabelle partitioniert wurde, kann die Verlaufstabelle auf der Standarddateigruppe erstellt werden, da die Partitionierungskonfiguration nicht automatisch von der aktuellen auf die Verlaufstabelle repliziert wird.If current table is partitioned, the history table is created on default file group because partitioning configuration is not replicated automatically from the current table to the history table.

  • Temporale Tabellen und Verlaufstabellen können nicht FILETABLE sein und können Spalten aller unterstützten Datentypen außer FILESTREAM enthalten, da FILETABLE und FILESTREAM die Datenbearbeitung außerhalb von SQL ServerSQL Server ermöglichen. Daher kann die Systemversionsverwaltung nicht garantiert werden.Temporal and history tables cannot be FILETABLE and can contain columns of any supported datatype other than FILESTREAM since FILETABLE and FILESTREAM allow data manipulation outside of SQL ServerSQL Server and thus system versioning cannot be guaranteed.

  • Eine Knoten- oder Edgetabelle kann nicht als temporale Tabelle erstellt oder in eine solche geändert werden.A node or edge table cannot be created as or altered to a temporal table.

  • Temporale Tabellen unterstützen zwar Blobdatentypen wie (n)varchar(max) , varbinary(max) , (n)text und image, ziehen jedoch signifikante Speicherkosten auf sich und wirken sich aufgrund ihrer Größe auf die Leistung aus.While temporal tables support blob data types, such as (n)varchar(max), varbinary(max), (n)text, and image, they will incur significant storage costs and have performance implications due to their size. Daher sollten Sie beim Entwerfen Ihres Systems vorsichtig sein, wenn Sie diese Datentypen verwenden.As such, when designing your system, care should be taken when using these data types.

  • Die Verlaufstabelle muss in der gleichen Datenbank wie die aktuelle Tabelle erstellt werden.History table must be created in the same database as the current table. Temporale Abfragen über Linked Server werden nicht unterstützt.Temporal querying over Linked Server is not supported.

  • Die Verlaufstabelle darf keine Einschränkungen aufweisen (Primärschlüssel, Fremdschlüssel, Tabellen- oder Spalteneinschränkungen).History table cannot have constraints (primary key, foreign key, table or column constraints).

  • Indizierte Sichten werden nicht zusätzlich zu temporalen Abfragen (Abfragen, die die Klausel FOR SYSTEM_TIME verwenden) unterstützt.Indexed views are not supported on top of temporal queries (queries that use FOR SYSTEM_TIME clause).

  • Die Onlineoption (WITH (ONLINE = ON) hat keine Auswirkungen auf ALTER TABLE ALTER COLUMN , wenn es sich um eine temporale Tabelle mit Systemversionsverwaltung handelt.Online option (WITH (ONLINE = ON) has no effect on ALTER TABLE ALTER COLUMN in case of system-versioned temporal table. ALTER COLUMN wird nicht im Modus „online“ durchgeführt. Dies gilt unabhängig vom Wert, der für die Option ONLINE festgelegt wurde.ALTER column is not performed as online regardless of which value was specified for ONLINE option.

  • INSERT - und UPDATE -Anweisungen können nicht auf die SYSTEM_TIME-Zeitraumspalten verweisen.INSERT and UPDATE statements cannot reference the SYSTEM_TIME period columns. Jeder Versuch, Werte direkt in diese Spalten einzufügen, wird blockiert.Attempts to insert values directly into these columns will be blocked.

  • TRUNCATE TABLE wird nicht unterstützt, während SYSTEM_VERSIONING auf ONTRUNCATE TABLE is not supported while SYSTEM_VERSIONING is ON

  • Die direkte Änderung von Daten in einer Verlaufstabelle ist nicht zulässig.Direct modification of the data in a history table is not permitted.

  • ON DELETE CASCADE und ON UPDATE CASCADE sind in der aktuellen Tabelle nicht zulässig.ON DELETE CASCADE and ON UPDATE CASCADE are not permitted on the current table. Das heißt, dass in den Fällen, wenn die temporale Tabelle als verweisende Tabelle in der Fremdschlüsselbeziehung (entspricht parent_object_id in sys.foreign_keys) fungiert, keine CASCADE-Optionen zulässig sind.In other words, when temporal table is referencing table in the foreign key relationship (corresponding to parent_object_id in sys.foreign_keys) CASCADE options are not allowed. Verwenden Sie Anwendungslogik oder AFTER-Trigger, um die Konsistenz beim Löschen in der Primärschlüsseltabelle (entspricht referenced_object_id in sys.foreign_keys) beizubehalten, wenn Sie diese Einschränkung umgehen möchten.To work around this limitation, use application logic or after triggers to maintain consistency on delete in primary key table (corresponding to referenced_object_id in sys.foreign_keys). Falls die Primärschlüsseltabelle temporal und die verweisende Tabelle nicht temporal ist, gibt es keine solche Einschränkung.If primary key table is temporal and referencing table is non-temporal, there's no such limitation.

    Hinweis

    Diese Einschränkung gilt nur für SQL Server 2016.This limitation applies to SQL Server 2016 only. CASCADE-Optionen werden in SQL-DatenbankSQL Database und in SQL Server-2017 ab CTP 2.0 unterstützt.CASCADE options are supported in SQL-DatenbankSQL Database and SQL Server 2017 starting from CTP 2.0.

  • INSTEAD OF -Trigger sind weder bei der aktuellen noch bei der Verlaufstabelle zulässig, um zu verhindern, dass die DML-Logik ungültig wird.INSTEAD OF triggers are not permitted on either the current or the history table to avoid invalidating the DML logic. AFTER -Trigger sind nur in der aktuellen Tabelle zulässig.AFTER triggers are permitted only on the current table. In der Verlaufstabelle werden sie blockiert, um zu vermeiden, dass die DML-Logik blockiert wird.They are blocked on the history table to avoid invalidating the DML logic.

  • Die Verwendung der Replikationstechniken ist eingeschränkt:Usage of replication technologies is limited:

    • Always On: Vollständig unterstützt.Always On: Fully supported
    • Change Data Capture und Änderungsnachverfolgung: Nur für die aktuelle Tabelle unterstützt.Change Data Capture and Change Data Tracking: Supported only on the current table
    • Momentaufnahme- und Transaktionsreplikation: Nur unterstützt für einen Verleger mit deaktivierten temporalen Tabellen und einen Abonnenten mit aktivierten temporalen Tabellen.Snapshot and transactional replication: Only supported for a single publisher without temporal being enabled and one subscriber with temporal enabled. In diesem Fall wird der Verleger für eine OLTP-Arbeitsauslastung verwendet, während der Abonnent zum Verlagern der Berichtserstellung dient (einschließlich „AS OF“-Abfragen).In this case, the publisher is used for an OLTP workload while subscriber serves for offloading reporting (including 'AS OF' querying). Die Verwendung von mehreren Abonnenten wird nicht unterstützt, da dieses Szenario zu inkonsistenten temporalen Daten führen könnte, da jeder von ihnen von der lokalen Systemuhr abhängig wäre.Use of multiple subscribers is not supported since this scenario may lead to inconsistent temporal data as each of them would depend on the local system clock.
    • Mergereplikation: Für temporale Tabellen nicht unterstützt.Merge replication: Not supported for temporal tables
  • Reguläre Abfragen betreffen nur Daten in der aktuellen Tabelle.Regular queries only affect data in the current table. Zum Abfragen von Daten in der Verlaufstabelle müssen Sie zeitliche Abfragen verwenden.To query data in the history table, you must use temporal queries. Diese werden weiter unten in diesem Thema im Abschnitt „Abfragen temporaler Daten“ behandelt.These are discussed later in this document in the section entitled Querying Temporal Data.

  • Eine optimale Indizierungsstrategie enthält einen gruppierten Columnstore-Index und/oder einen B-Strukturindex auf der aktuellen Tabelle und einen Columnstore-Index auf der Verlaufstabelle für die optimale Speichergröße und -Leistung.An optimal indexing strategy will include a clustered columns store index and / or a B-tree rowstore index on the current table and a clustered columnstore index on the history table for optimal storage size and performance. Falls Sie Ihre eigene Verlaufstabelle erstellen oder verwenden, empfehlen wir Ihnen dringend, diese Art Index zu erstellen. Dieser Index sollte aus Zeitraumspalten bestehen und mit der Spalte „Ende des Zeitraums“ beginnen, um die temporalen Abfragen sowie die Abfragen, die Teil der Datenkonsistenzüberprüfung sind, zu beschleunigen.If you create / use your own history table, we strongly recommend that you create this type of index consisting of period columns starting with the end of period column to speed up temporal querying as well as speeding up the queries that are part of the data consistency check. Die Standardverlaufstabelle hat einen für Sie erstellten gruppierten Rowstore-Index, der auf den Zeitraumspalten (Ende, Start) basiert.The default history table has a clustered rowstore index created for you based on the period columns (end, start). Ein nicht gruppierter Rowstore-Index wird mindestens empfohlen.At a minimum, a nonclustered rowstore index is recommended.

  • Die folgenden Objekte bzw. Eigenschaften werden beim Erstellen der Verlaufstabelle nicht aus der aktuellen Tabelle in die Verlaufstabelle repliziert:The following objects/properties are not replicated from the current to the history table when the history table is created:

    • PeriodendefinitionPeriod definition
    • IdentitätsdefinitionIdentity definition
    • IndizesIndexes
    • StatistikStatistics
    • Check-EinschränkungenCheck constraints
    • TriggerTriggers
    • PartitionierungskonfigurationPartitioning configuration
    • BerechtigungenPermissions
    • Prädikate für die Sicherheit auf ZeilenebeneRow-level security predicates
  • Eine Verlaufstabelle kann nicht als aktuelle Tabelle in einer Kette von Verlaufstabellen konfiguriert werden.A history table cannot be configured as current table in a chain of history tables.

Weitere InformationenSee Also