EdgeeinschränkungenEdge constraints

Anwendungsbereich:Applies to: Ja SQL ServerSQL Server (alle unterstützten Versionen)yesSQL ServerSQL Server (all supported versions) JaAzure SQL-DatenbankAzure SQL DatabaseYesAzure SQL-DatenbankAzure SQL DatabaseAnwendungsbereich:Applies to: Ja SQL ServerSQL Server (alle unterstützten Versionen)yesSQL ServerSQL Server (all supported versions) JaAzure SQL-DatenbankAzure SQL DatabaseYesAzure SQL-DatenbankAzure SQL Database

Edgeeinschränkungen können verwendet werden, um die Datenintegrität und eine spezifische Semantik in den Edgetabellen in einer SQL ServerSQL Server-Graph-Datenbank zu erzwingen.Edge constraints can be used to enforce data integrity and specific semantics on the edge tables in SQL ServerSQL Server graph database.

EdgeeinschränkungenEdge Constraints

Im ersten Release der Graph-Features wurde für die Endpunkt des Edge durch die Edgetabellen nichts erzwungen.In the first release of graph features, edge tables did not enforce anything for the endpoints of the edge. Anders gesagt: Ein Edge in einer Graph-Datenbank konnte unabhängig vom Knotentyp eine Verbindung von jedem Knoten mit jedem Knoten herstellen.That is, an edge in a graph database could connect any node to any other node, regardless of the type.

In diesem Release werden Edgeeinschränkungen eingeführt, mit denen Benutzer Einschränkungen zu ihren Edgetabellen hinzufügen und damit eine bestimmte Semantik erzwingen und die Datenintegrität sicherstellen können.This release introduces edge constraints, which enable users to add constraints to their edge tables, thereby enforcing specific semantics and also maintaining data integrity. Wenn einer Edgetabelle mit Edgeeinschränkungen ein neues Edge hinzugefügt wird, erzwingt die Datenbank-EngineDatabase Engine, dass die Knoten, mit denen das Edge eine Verbindung herstellen möchte, in den richtigen Knotentabellen vorhanden sein müssen.When a new edge is added to an edge table with edge constraints, the Datenbank-EngineDatabase Engine enforces that the nodes which the edge is trying to connect, exist in the proper node tables. Es wird ebenfalls sichergestellt, dass ein Knoten nicht gelöscht werden kann, wenn noch von einem Edge auf ihn verwiesen wird.It is also ensured that a node cannot be dropped, if it is still referenced by an edge.

EdgeeinschränkungsklauselnEdge Constraint Clauses

Jede Edgeeinschränkung besteht aus mindestens einer Edgeeinschränkungsklausel.Each edge constraint consists of one or more edge constraint clause(s). Eine Edgeeinschränkungsklausel ist ein Paar aus FROM- und TO-Knoten, das vom angegebenen Edge verbunden werden kann.An edge constraint clause is the pair of FROM and TO nodes that the given edge could connect.

Ein Beispiel: Sie haben die Knoten Product und Customer in Ihrem Graph und verwenden ein Bought-Edge, um diese Knoten zu verbinden.Consider that you have Product and Customer nodes in your graph and you use Bought edge to connect these nodes. Die Edgeeinschränkungsklausel gibt das FROM- und TO-Knotenpaar und die Richtung des Edge an.The edge constraint clause specifies the FROM and TO node pair and the direction of the edge. In diesem Fall lautet die Edgeeinschränkungsklausel „Customer TO Product“.In this case the edge constraint clause will be Customer TO Product. Das bedeutet Folgendes: Das Einfügen eines Bought-Edge von Customer zu Product ist zulässig.That is, inserting a Bought that goes from a Customer to Product will be allowed. Es ist aber nicht möglich, ein Edge von Product zu Customer einzufügen.Attempts to insert an edge that goes from Product to Customer fail.

  • Eine Edgeeinschränkungsklausel enthält ein Paar aus FROM- und TO-Knotentabellen, in denen die Edgeeinschränkung erzwungen wird.An edge constraint clause contains a pair of FROM and TO node tables that the edge constraint is enforced on.
  • Benutzer können für jede Edgeeinschränkung mehrere Edgeeinschränkungsklauseln angeben, die als Disjunktion angewendet werden.Users may specify multiple edge constraint clauses per edge constraint, which will be applied as a disjunction.
  • Wenn in einer einzelnen Edgetabelle mehrere Edgeeinschränkungen erstellt werden, müssen Edges ALLE Einschränkungen zulassen.If multiple edge constraints are created on a single edge table, edges must satisfy ALL constraints to be allowed.

Indizes in EdgeeinschränkungenIndexes on edge constraints

Durch Erstellen einer Edgeeinschränkung wird nicht automatisch ein entsprechender Index in den $from_id- und $to_id-Spalten der Edgetabelle erstellt.Creating an edge constraint does not automatically create a corresponding index on $from_id and $to_id columns in the edge table. Es empfiehlt sich, manuell einen Index in einem $from_id,$to_id-Spaltenpaar zu erstellen, wenn Sie Punktsuchabfragen oder OLTP-Workloads verarbeiten.Manually creating an index on a $from_id, $to_id pair is recommended if you have point lookup queries or OLTP workload.

ON DELETE: referenzielle Aktionen bei EdgeeinschränkungenON DELETE referential actions on edge constraints

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.Cascading actions on an edge constraint let users define the actions that the database engine takes when a user deletes the node(s), which the given edge connects. Die folgenden referenziellen Aktionen können definiert werden:The following referential actions can be defined:
NO ACTION NO ACTION
Die Datenbank-Engine löst einen Fehler aus, wenn Sie versuchen, einen Knoten zu löschen, der über verbundene Edges verfügt.The database engine raises an error when you try to delete a node that has connecting edge(s).

CASCADE CASCADE
Wenn ein Knoten aus der Datenbank gelöscht wird, werden auch die verbundenen Edges gelöscht.When a node is delete from the database, connecting edge(s) are deleted.

Arbeiten mit EdgeeinschränkungenWorking with edge constraints

Sie können mit Transact-SQLTransact-SQL eine Edgeeinschränkung in SQL ServerSQL Server definieren.You can define a edge constraint in SQL ServerSQL Server by using Transact-SQLTransact-SQL. Eine Edgeeinschränkung kann nur in einer Graph-Edgetabelle definiert werden.An edge constraint can be defined on a graph edge table only. Zum Erstellen, Löschen oder Ändern einer Edgeeinschränkung müssen Sie über die ALTER-Berechtigung für die Tabelle verfügen.To create, delete, or modify an edge constraint, you must have ALTER permission on the table.

Erstellen von EdgeeinschränkungenCreate edge constraints

Die folgenden Beispiele zeigen, wie eine Edgeeinschränkung für neue oder vorhandene Tabellen erstellt wird.The following examples show you how to create an edge constraints on new or existing tables

So erstellen Sie eine Edgeeinschränkung in einer neuen EdgetabelleTo create an edge constraint on a new edge table

Das folgende Beispiel erstellt eine Edgeeinschränkung in der Edgetabelle bought.The following example creates an edge constraint on the bought edge table.

-- 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 EdgetabelleDefining referential actions on a new edge table

Im folgenden Beispiel wird eine Edgeeinschränkung für die gekaufte Edgetabelle erstellt und die referenzielle Aktion DELETE CASCADE definiert.The following example creates an edge constraint on the bought edge table and defines ON DELETE CASCADE referential action.

-- 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 hinzuTo add edge constraint to an existing edge table

Das folgende Beispiel verwendet ALTER TABLE, um der Edgetabelle bought eine Edgeeinschränkung hinzuzufügen.The following example uses ALTER TABLE to add an edge constraint to the bought edge table.

-- 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änkungsklauselnCreate a new edge constraint on existing edge table, with additional edge constraint clauses

Das folgende Beispiel verwendet den Befehl ALTER TABLE, um eine neue Edgeeinschränkung mit zusätzlichen Edgeeinschränkungsklauseln in der Edgetabelle bought hinzuzufügen.The following example uses the ALTER TABLE command to add a new edge constraint with additional edge constraint clauses on the bought edge table.

-- 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 zwei Edgeeinschränkungsklauseln: Eine stellt eine Verbindung zwischen Customer und Product her, die andere verbindet Supplier mit Product.In the preceding example, there are two edge constraint clauses in EC_BOUGHT1 constraint, one that connects Customer to Product and other connects Supplier to Product. Beide Klauseln werden in Disjunktion angewendet.Both these clauses are applied in disjunction. Das bedeutet, dass ein Edge die Bedingung einer der beiden Klauseln erfüllen muss, um in der Edgetabelle zugelassen zu werden.That is, a given edge has to satisfy either of these two clauses to be allowed in the edge table.

Erstellen einer neuen Edgeeinschränkung für eine vorhandenen Edgetabelle mit einer neuen EdgeeinschränkungsklauselCreating a new edge constraint on existing edge table, with new edge constraint clause

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.The following example uses the ALTER TABLE command to add a new edge constraint with a new edge constraint clause on the bought edge table.

-- 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
ALTER TABLE bought ADD CONSTRAINT EC_BOUGHT1 CONNECTION (Supplier TO Product);

Im Beispiel oben haben wir zwei separate Edgeeinschränkungen in der Edgetabelle bought erstellt: EC_BOUGHT und EC_BOUGHT1.In the preceding example, we created two separate edge constraints on the bought edge table, EC_BOUGHT and EC_BOUGHT1. Beide Edgeeinschränkungen weisen unterschiedliche Edgeeinschränkungsklauseln auf.Both these edge constraints have different edge constraint clauses. 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.If an edge table has more than one edge constraint on it, a given edge has to satisfy ALL edge constraints to be allowed in the edge table. Da kein Edge hier sowohl EC_BOUGHT als auch EC_BOUGHT1 erfüllen kann, muss die Tabelle bought leer bleiben.Since no edge will be able to satisfy both EC_BOUGHT and EC_BOUGHT1 here, the bought edge table must remain empty.

Damit Einfügungen in diese Edgetabelle funktionieren, muss entweder eine der Edgeeinschränkungen gelöscht werden, oder es müssen beide Einschränkungen gelöscht und eine neue Edgeeinschränkung erstellt werden, die beide Edgeeinschränkungsklauseln enthält.For inserts to succeed in this edge table, either one of the edge constraint must be dropped, or both of them must be dropped and a new edge constraint should be created which has both edge constraint clauses in it.

-- Drop the existing edge constraint first and then create a new one.
ALTER TABLE bought DROP CONSTRAINT EC_BOUGHT;
GO
ALTER TABLE bought DROP CONSTRAINT EC_BOUGHT1;
GO
ALTER TABLE bought ADD CONSTRAINT EC_BOUGHT_NEW CONNECTION (Customer TO Product, Supplier TO Product);
GO

Damit ein Edge in der Edgetabelle bought zugelassen wird, muss er eine der Edgeeinschränkungsklauseln in der Einschränkung EC_BOUGHT_NEW erfüllen.For a given edge to be allowed in the bought edge, it has to satisfy either of the edge constraint clauses in EC_BOUGHT_NEW constraint. Daher wird jedes Edge zugelassen, das versucht, eine Verbindung zwischen den gültigen Knoten Customer und Product bzw. Supplier und Product herzustellen.Hence any edge that is trying to connect valid Customer to Product or Supplier to Product nodes, will be allowed.

Löschen von EdgeeinschränkungenDelete edge constraints

Das folgende Beispiel identifiziert zuerst den Namen der Edgeeinschränkung und löscht die Einschränkung dann.The following example first identifies the name of the edge constraint and then deletes the constraint.

-- 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änkungenModify edge constraints

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.To modify an edge constraint using Transact-SQL, you must first delete the existing edge constraint and then re-create it with the new definition.

Anzeigen von EdgeeinschränkungenView edge constraints

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.The visibility of the metadata in catalog views is limited to securables that a user either owns or on which the user has been granted some permission. Weitere Informationen finden Sie unter Metadata Visibility Configuration.For more information, see Metadata Visibility Configuration.

Das Beispiel gibt alle Edgeeinschränkungen und ihre Eigenschaften für die Edgetabelle bought in der tempdb-Datenbank zurück.The example returns all edge constraints and their properties for the edge table bought in the tempdb database.

-- 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');

CREATE TABLE (SQL-Graph)CREATE TABLE (SQL Graph)
ALTER TABLE table_constraintALTER TABLE table_constraint

Weitere Informationen zur Graphtechnologie in SQL Server finden Sie unter Graphverarbeitung mit SQL Server und Azure SQL-Datenbank.For information about graph technology in SQL Server, see Graph processing with SQL Server and Azure SQL Database.