Edgeeinschränkungen

Gilt für: SQL Server 2019 (15.x) und höher Azure SQL-DatenbankAzure SQL Managed Instance

Edgeeinschränkungen können verwendet werden, um die Datenintegrität und eine spezifische Semantik in den Edgetabellen in einer SQL Server-Graph-Datenbank zu erzwingen.

Edgeeinschränkungen

Edgetabellen erzwingen standardmäßig keine Aktionen für die Edgeendpunkte. Anders gesagt: Ein Edge in einer Graph-Datenbank konnte unabhängig vom Knotentyp eine Verbindung von jedem Knoten mit jedem Knoten herstellen.

SQL Graph unterstützt Edgeeinschränkungen, mit denen Benutzer Einschränkungen zu ihren Edgetabellen hinzufügen und damit eine bestimmte Semantik erzwingen und die Datenintegrität sicherstellen können. Wenn einer Edgetabelle mit Edgeeinschränkungen ein neues Edge hinzugefügt wird, erzwingt die Datenbank-Engine, dass die Knoten, mit denen das Edge eine Verbindung herstellen möchte, in den richtigen Knotentabellen vorhanden sein müssen. Es wird ebenfalls sichergestellt, dass ein Knoten nicht gelöscht werden kann, wenn noch eine Edge auf ihn verweist.

Edgeeinschränkungsklauseln

Eine einzelne Edgeeinschränkung besteht aus mindestens einer Edgeeinschränkungsklausel.

CONSTRAINT constraint_name CONNECTION (cause1[, clause2...])
  • Eine Edgeeinschränkungsklausel ist ein Paar aus Knotentabellennamen, getrennt durch das Schlüsselwort TO.
  • Der erste Tabellenname in der Edgeeinschränkungsklausel ist der Name der FROM-Knotentabelle für die Edgebeziehung.
  • Der zweite Tabellenname in der Edgeeinschränkungsklausel ist der Name der TO-Knotentabelle für die Edgebeziehung.
  • Das Tabellennamenpaar gibt daher die Richtung der Edgebeziehung an.
  • Wie bereits erwähnt, kann eine Edgeeinschränkung eine oder mehrere Edgeeinschränkungsklauseln enthalten.

Mehrere Einschränkungen und Klauseln

  • Mehrere Edgeeinschränkungen, die für dieselbe Edgetabelle definiert sind, werden mit einem AND-Operator erzwungen.
  • Mehrere Edgeeinschränkungsklauseln, die innerhalb derselben Edgeeinschränkung definiert sind, werden mit einem OR-Operator erzwungen.

Betrachten Sie die Knoten Supplier und Customer in Ihrem Graphen. Jeder Knoten kann durch eine einzelne freigegebene Edgetabelle mit dem Knoten Product verknüpft sein: bought. Die Edgetabelle bought unterstützt die Beziehungstypen Customer-(bought)->Product und Supplier-(bought)->Product. Dies kann mithilfe einer einzelnen Edgeeinschränkung mit mehreren Edgeeinschränkungsklauseln erreicht werden.

Beispiele
CONSTRAINT EC_BOUGHT CONNECTION (Customer TO Product)

Das obige Beispiel zeigt eine einzelne Edgeeinschränkung mit einer einzelnen Edgeeinschränkungsklausel. Diese Einschränkung unterstützt Customer-(bought)->Product. Das Einfügen einer bought-Edgebeziehung von einem Customer zu einem Product wäre also zulässig. Das Einfügen anderer Knotenkombinationen, z. B. Supplier-(bought)->Product, würde zu einem Fehler führen, obwohl eine solche Kombination eine gültige Beziehung in der realen Welt beschreiben könnte.

CONSTRAINT EC_BOUGHT CONNECTION (Supplier TO Product, Customer TO Product)

Das obige Beispiel definiert eine einzelne Edgeeinschränkung mit zwei Edgeeinschränkungsklauseln. Dank dieser Einschränkungsklauseln kann das bought-Edge entweder Supplier-(bought)->Product- oder Customer-(bought)->Product-Beziehungen enthalten. Das Einfügen anderer Arten von Edgebeziehungen in die Tabelle bought würde zu einem Fehler führen.

CONSTRAINT EC_BOUGHT1 CONNECTION (Supplier TO Product)
CONSTRAINT EC_BOUGHT2 CONNECTION (Customer TO Product)

Das obige Beispiel zeigt zwei Einschränkungen in ein und derselben Edgetabelle, wobei jede Edgeeinschränkung genau eine Einschränkungsklausel angibt. In dieser Situation lässt SQL nur Einfügungen zu, die BEIDE Edgeeinschränkungsklauseln gleichzeitig erfüllen. Dies ist nicht möglich. Es gibt kein Knotenpaar, das beide Edgeeinschränkungsklauseln erfüllen kann. Diese Kombination aus Edgeeinschränkungen macht die Edgetabelle unbrauchbar.

Eine ausführliche Erläuterung dazu, wo mehrere Edgeeinschränkungen in einem realen Szenario verwendet werden können, finden Sie im Beispiel „Erstellen einer neuen Edgeeinschränkung für eine vorhandene Edgetabelle mit einer neuen Edgeeinschränkungsklausel“ weiter unten auf dieser Seite.

Indizes in Edgeeinschränkungen

Durch Erstellen einer Edgeeinschränkung wird nicht automatisch ein entsprechender Index in den $from_id- und $to_id-Spalten der Edgetabelle erstellt. Es empfiehlt sich, manuell einen Index in einem $from_id,$to_id-Spaltenpaar zu erstellen, wenn Sie Punktsuchabfragen oder OLTP-Workloads verarbeiten.

ON DELETE: referenzielle Aktionen bei Edgeeinschränkungen

Mit kaskadierende Aktionen für eine Edgeeinschränkung können Benutzer die von der Datenbank-Engine durchzuführenden Aktionen definieren, wenn ein Benutzer die Knoten löscht, die über den angegebenen Edge verbunden werden. Die folgenden referenziellen Aktionen können definiert werden: NO ACTION. Die Datenbank-Engine löst einen Fehler aus, wenn Sie versuchen, einen Knoten zu löschen, der über verbundene Edges verfügt.

CASCADE Wenn ein Knoten aus der Datenbank gelöscht wird, werden auch die verbundenen Edges gelöscht.

Arbeiten mit Edgeeinschränkungen

Sie können mit Transact-SQL eine Edgeeinschränkung in SQL Server definieren. Eine Edgeeinschränkung kann nur in einer Graph-Edgetabelle definiert werden. Zum Erstellen, Löschen oder Ändern einer Edgeeinschränkung müssen Sie über die ALTER-Berechtigung für die Tabelle verfügen.

Erstellen von Edgeeinschränkungen

Die folgenden Beispiele zeigen, wie eine Edgeeinschränkung für neue oder vorhandene Tabellen erstellt wird.

So erstellen Sie eine Edgeeinschränkung in einer neuen Edgetabelle

Das folgende Beispiel erstellt eine Edgeeinschränkung in der Edgetabelle bought.

-- CREATE node and edge tables
CREATE TABLE Customer
   (
      ID INTEGER PRIMARY KEY
      ,CustomerName VARCHAR(100)
   )
AS NODE;
GO
CREATE TABLE Product
   (
      ID INTEGER PRIMARY KEY
      ,ProductName VARCHAR(100)
   )
AS NODE;
GO
CREATE TABLE bought
   (
      PurchaseCount INT
         ,CONSTRAINT EC_BOUGHT CONNECTION (Customer TO Product) ON DELETE NO ACTION
   )
   AS EDGE;

Definieren von referenziellen Aktionen für eine neue Edgetabelle

Im folgenden Beispiel wird eine Edgeeinschränkung für die Edgetabelle bought erstellt und die referenzielle Aktion DELETE CASCADE definiert.

-- CREATE node and edge tables
CREATE TABLE Customer
   (
      ID INTEGER PRIMARY KEY
      ,CustomerName VARCHAR(100)
   )
AS NODE;
GO
CREATE TABLE Product
   (
      ID INTEGER PRIMARY KEY
      ,ProductName VARCHAR(100)
   )
AS NODE;
GO
CREATE TABLE bought
   (
      PurchaseCount INT
         ,CONSTRAINT EC_BOUGHT CONNECTION (Customer TO Product) ON DELETE CASCADE
   )
   AS EDGE;

So fügen Sie einer vorhandenen Edgetabelle eine Edgeeinschränkung hinzu

Das folgende Beispiel verwendet ALTER TABLE, um der Edgetabelle bought eine Edgeeinschränkung hinzuzufügen.

-- CREATE node and edge tables
CREATE TABLE Customer
   (
      ID INTEGER PRIMARY KEY
      , CustomerName VARCHAR(100)
   )
   AS NODE;
CREATE TABLE Product
   (
      ID INTEGER PRIMARY KEY
      , ProductName VARCHAR(100)
   )
   AS NODE;
GO
CREATE TABLE bought
   (
      PurchaseCount INT
   )
   AS EDGE;
GO
ALTER TABLE bought ADD CONSTRAINT EC_BOUGHT1 CONNECTION (Customer TO Product);

Erstellen einer Edgeeinschränkung für eine vorhandene Edgetabelle mit zusätzlichen Edgeeinschränkungsklauseln

Das folgende Beispiel verwendet den Befehl ALTER TABLE, um eine neue Edgeeinschränkung mit zusätzlichen Edgeeinschränkungsklauseln in der Edgetabelle bought hinzuzufügen.

-- CREATE node and edge tables
CREATE TABLE Customer
   (
      ID INTEGER PRIMARY KEY
      , CustomerName VARCHAR(100)
   )
   AS NODE;
GO
CREATE TABLE Supplier
   (
      ID INTEGER PRIMARY KEY
      , SupplierName VARCHAR(100)
   )
   AS NODE;
GO
CREATE TABLE Product
   (
      ID INTEGER PRIMARY KEY
      , ProductName VARCHAR(100)
   )
   AS NODE;
GO
CREATE TABLE bought
   (
      PurchaseCount INT
      , CONSTRAINT EC_BOUGHT CONNECTION (Customer TO Product)
   )
   AS EDGE;
-- Drop the existing edge constraint first and then create a new one.
ALTER TABLE bought DROP CONSTRAINT EC_BOUGHT;
GO
-- User ALTER TABLE to create a new edge constraint.
ALTER TABLE bought ADD CONSTRAINT EC_BOUGHT1 CONNECTION (Customer TO Product, Supplier TO Product);

Im Beispiel oben gibt es in der Einschränkung EC_BOUGHT1-Einschränkung zwei Edgeeinschränkungsklauseln: Eine stellt eine Verbindung zwischen Customer und Product und eine stellt eine Verbindung zwischen Supplier und Product her. Beide Klauseln werden in Disjunktion angewendet. Das bedeutet, dass ein Edge die Bedingung einer der beiden Klauseln erfüllen muss, um in der Edgetabelle zugelassen zu werden.

Erstellen einer neuen Edgeeinschränkung für eine vorhandenen Edgetabelle mit einer neuen Edgeeinschränkungsklausel

Das folgende Beispiel verwendet den Befehl ALTER TABLE, um eine neue Edgeeinschränkung mit einer neuen Edgeeinschränkungsklausel für die Edgetabelle bought hinzuzufügen.

-- CREATE node and edge tables
CREATE TABLE Customer
  (
     ID INTEGER PRIMARY KEY
     , CustomerName VARCHAR(100)
  )
  AS NODE;
GO
CREATE TABLE Supplier
  (
     ID INTEGER PRIMARY KEY
     , SupplierName VARCHAR(100)
  )
  AS NODE;
GO
CREATE TABLE Product
  (
     ID INTEGER PRIMARY KEY
     , ProductName VARCHAR(100)
  )
  AS NODE;
GO
CREATE TABLE bought
  (
     PurchaseCount INT,
        CONSTRAINT EC_BOUGHT CONNECTION (Customer TO Product)
  )
  AS EDGE;
GO

Angenommen, im vorherigen Beispiel soll jetzt über die Edgetabelle bought auch die Beziehung zwischen Supplier und Product eingeschlossen werden. Sie können versuchen, eine neue Edgeeinschränkung hinzuzufügen:

ALTER TABLE bought ADD CONSTRAINT EC_BOUGHT1 CONNECTION (Supplier TO Product);

Das Hinzufügen einer neuen Edgeeinschränkung ist jedoch nicht die richtige Lösung. Es wurden zwei separate Edgeeinschränkungen in der Edgetabelle boughterstellt: EC_BOUGHT und EC_BOUGHT1. Beide Edgeeinschränkungen weisen unterschiedliche Edgeeinschränkungsklauseln auf. Wenn eine Edgetabelle über mehr als eine Edgeeinschränkung verfügt, muss ein Edge ALLE Edgeeinschränkungen erfüllen, um in der Tabelle zugelassen zu werden. Da hier kein Edge sowohl EC_BOUGHT als auch EC_BOUGHT1 hier erfüllen kann, tritt bei der obigen ALTER TABLE-Anweisung ein Fehler auf, wenn dort irgendwelche Zeilen in der Edgetabelle bought vorhanden sind.

Sie können diese Edgeeinschränkung erfolgreich erstellen, indem Sie beispielsweise die folgende vorgeschriebene Sequenz verwenden:

-- First, add the desired ("super-set") constraint:
ALTER TABLE bought ADD CONSTRAINT EC_BOUGHT_NEW CONNECTION (Customer TO Product, Supplier TO Product);
GO

-- Then, drop the older edge constraint:
ALTER TABLE bought DROP CONSTRAINT EC_BOUGHT;
GO

-- If needed, you can rename the new edge constraint to match the original name:
EXECUTE sp_rename '[dbo].[EC_BOUGHT_NEW]', '[dbo].[EC_BOUGHT]';

Da zunächst die neue Einschränkung "super-set" hinzugefügt wurde, ohne die vorherige Einschränkung zu löschen, ist ein reiner Metadatenvorgang möglich. Eine Überprüfung aller vorhandenen Daten in der bought-Tabelle ist nicht nötig, da die vorhandene Einschränkung darin enthalten ist.

Damit also ein Edge in der bought-Edge zugelassen wird, muss es eine der Edgeeinschränkungsklauseln in der Einschränkung EC_BOUGHT_NEW erfüllen. Daher ist jedes Edge, das versucht, gültige Customer mit Product oder Supplier mit Product-Knoten zu verbinden, zulässig.

Löschen von Edgeeinschränkungen

Das folgende Beispiel identifiziert zuerst den Namen der Edgeeinschränkung und löscht die Einschränkung dann.

-- CREATE node and edge tables
CREATE TABLE Customer
   (
      ID INTEGER PRIMARY KEY
      , CustomerName VARCHAR(100)
   )
   AS NODE;
GO
CREATE TABLE Product
   (
      ID INTEGER PRIMARY KEY
      , ProductName VARCHAR(100)
   ) AS NODE;
GO
CREATE TABLE bought
   (
      PurchaseCount INT
      , CONSTRAINT EC_BOUGHT CONNECTION (Customer TO Product)
    )
    AS EDGE;
GO

-- Return the name of edge constraint.
SELECT name
   FROM sys.edge_constraints
   WHERE type = 'EC' AND parent_object_id = OBJECT_ID('bought');
GO

-- Delete the primary key constraint.
ALTER TABLE bought
DROP CONSTRAINT EC_BOUGHT;

Ändern von Edgeeinschränkungen

Um eine Edgeeinschränkung mit Transact-SQL ändern zu können, müssen Sie zuerst die vorhandene Edgeeinschränkung löschen und sie dann mit der neuen Definition neu erstellen.

Anzeigen von Edgeeinschränkungen

Die Sichtbarkeit der Metadaten in Katalogsichten ist auf sicherungsfähige Elemente eingeschränkt, bei denen der Benutzer entweder der Besitzer ist oder für die dem Benutzer eine Berechtigung erteilt wurde. Weitere Informationen finden Sie unter Metadata Visibility Configuration.

Das Beispiel gibt alle Edgeeinschränkungen und ihre Eigenschaften für die Edgetabelle bought in der tempdb-Datenbank zurück.

-- CREATE node and edge tables
CREATE TABLE Customer
   (
      ID INTEGER PRIMARY KEY
      , CustomerName VARCHAR(100)
   )
   AS NODE;
GO
CREATE TABLE Supplier
   (
      ID INTEGER PRIMARY KEY
      , SupplierName VARCHAR(100)
   )
   AS NODE;
   GO
CREATE TABLE Product
   (
      ID INTEGER PRIMARY KEY
      , ProductName VARCHAR(100)
   )
   AS NODE;

-- CREATE edge table with edge constraints.
CREATE TABLE bought
   (
      PurchaseCount INT
      , CONSTRAINT EC_BOUGHT CONNECTION (Customer TO Product, Supplier TO Product)
   )
   AS EDGE;

-- Query sys.edge_constraints and sys.edge_constraint_clauses to view
-- edge constraint properties.
SELECT
   EC.name AS edge_constraint_name
   , OBJECT_NAME(EC.parent_object_id) AS edge_table_name
   , OBJECT_NAME(ECC.from_object_id) AS from_node_table_name
   , OBJECT_NAME(ECC.to_object_id) AS to_node_table_name
   , is_disabled
   , is_not_trusted
FROM sys.edge_constraints EC
   INNER JOIN sys.edge_constraint_clauses ECC
   ON EC.object_id = ECC.object_id
WHERE EC.parent_object_id = object_id('bought');

Nächste Schritte