Diagnoseeinschränkungen erstellen und verwalten

Mit der CHECK-Einschränkung können Sie festlegen, dass die Werte einer oder mehrerer Spalten einen booleschen Ausdruck erfüllen müssen. In diesem Artikel wird beschrieben, wie Sie diese Art von Einschränkung in Ihrer Datenbank verwalten können.

Diagnoseeinschränkung zu einer neuen Tabelle hinzufügen

Im folgenden CREATE TABLE-Snippet wird eine Tabelle mit Informationen zu Konzerten erstellt. Damit das Ende eines Konzerts nach dem Beginn liegt, fügen Sie eine Diagnoseeinschränkung ein.

CREATE TABLE Concert (
  ConcertId STRING(20),
  StartTime Timestamp,
  EndTime Timestamp,
  CONSTRAINT start_before_end CHECK(StartTime < EndTime),
) PRIMARY KEY (ConcertId);

Die Einschränkungsdefinition beginnt mit dem Suchbegriff CONSTRAINT. Wir haben die Einschränkung in diesem Beispiel explizit als start_before_end bezeichnet. Dadurch können Sie sie in Fehlermeldungen einfacher erkennen und sie bei Bedarf leicht referenzieren. Wenn kein Name angegeben ist, stellt Cloud Spanner einen Namen bereit, wobei der Name mit dem Präfix CK_ beginnt. Einschränkungsnamen sind zusammen mit den Namen für Tabellen und Indizes auf das Schema beschränkt und müssen innerhalb des Schemas eindeutig sein. Die Definition der Diagnoseeinschränkung besteht aus dem Suchbegriff CHECK, gefolgt von einem Ausdruck in Klammern. Der Ausdruck kann nur auf Spalten dieser Tabelle verweisen. In diesem Beispiel wird auf StartTime und EndTime verwiesen und die Diagnose hier stellt sicher, dass die Startzeit eines Konzerts immer früher als die Endzeit ist.

Der Wert des Ausdrucks der Diagnoseeinschränkung wird ausgewertet, wenn eine neue Zeile eingefügt oder StartTime oder EndTime einer vorhandenen Zeile aktualisiert wird. Wenn der Ausdruck TRUE oder NULL ergibt, ist die Datenänderung durch die Diagnoseeinschränkung zulässig. Wenn der Ausdruck FALSE ergibt, ist die Datenänderung nicht zulässig.

  • Die folgenden Einschränkungen gelten für den Begriff expression einer Diagnoseeinschränkung.

    • Der Ausdruck kann nur auf Spalten in derselben Tabelle verweisen.

    • Der Ausdruck muss mindestens auf eine nicht generierte Spalte verweisen, sei es direkt oder über eine generierte Spalte, die auf eine nicht generierte Spalte verweist.

    • Der Ausdruck kann nicht auf Spalten verweisen, für die die Option allow_commit_timestamp festgelegt wurde.

    • Der Ausdruck darf keine Unterabfragen enthalten.

    • Der Ausdruck darf keine nicht deterministischen Funktionen wie CURRENT_DATE() und CURRENT_TIMESTAMP() enthalten.

Diagnoseeinschränkung zu einer vorhandenen Tabelle hinzufügen

Mit der folgenden ALTER TABLE-Anweisung fügen wir eine Einschränkung hinzu, die dafür sorgt, dass alle Konzert-IDs größer als null sind.

ALTER TABLE Concerts
ADD CONSTRAINT concert_id_gt_0 CHECK (ConcertId > 0);

Auch hier hat die Einschränkung den Namen concert_id_gt_0. Durch Hinzufügen einer CHECK-Einschränkung zu einer vorhandenen Tabelle wird die Durchsetzung der Einschränkung für neue Daten sofort gestartet und ein Vorgang mit langer Ausführungszeit gestartet, um zu prüfen, ob vorhandene Daten der neuen Einschränkung entsprechen. Da diese Validierung als lang andauernder Vorgang durchgeführt wird, sind laufende Transaktionen in der Tabelle nicht betroffen. Weitere Informationen finden Sie unter Leistung während der Schemaaktualisierung. Wenn Verstöße gegen vorhandene Daten vorliegen, wird die Einschränkung rückgängig gemacht.

Diagnoseeinschränkung entfernen

Mit der folgenden DDL-Anweisung wird eine CHECK-Einschränkung aus der Tabelle Concerts entfernt.

ALTER TABLE Concerts
DROP CONSTRAINT concert_id_gt_0;

Ausdruck der Diagnoseeinschränkung ändern

Der Ausdruck einer CHECK-Einschränkung kann nicht geändert werden. Stattdessen müssen Sie die vorhandene Einschränkung löschen und mit dem neuen Ausdruck eine neue Einschränkung erstellen.

Attribute einer Diagnoseeinschränkung aufrufen

Das INFORMATION_SCHEMA von Cloud Spanner enthält Informationen zu den Diagnoseeinschränkungen in Ihrer Datenbank. Im Folgenden finden Sie einige Beispiele für Fragen, die Sie durch Abfragen des Informationsschemas beantworten können.

Welche Diagnoseeinschränkungen sind in meiner Datenbank definiert?

SELECT tc.CONSTRAINT_NAME, tc.TABLE_NAME, tc.CONSTRAINT_TYPE
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS as tc
WHERE tc.CONSTRAINT_TYPE = "CHECK";

Wie lautet der aktuelle Status der Diagnoseeinschränkungen in meiner Datenbank?

Wenn Sie einer vorhandenen Tabelle eine Diagnoseeinschränkung hinzugefügt haben, möchten Sie möglicherweise deren aktuellen Status anzeigen, um beispielsweise festzustellen, ob alle vorhandenen Daten anhand der Einschränkung geprüft wurden. Wenn SPANNER_STATE in der folgenden Abfrage VALIDATING_DATA zurückgibt, bedeutet dies, dass Cloud Spanner noch vorhandene Daten anhand dieser Einschränkung prüft.

SELECT cc.CONSTRAINT_NAME, cc.SPANNER_STATE
FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS as cc;

Nächste Schritte