Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für: SQL Server 2019 (15.x) und höher
Azure SQL-Datenbank
Azure SQL Managed Instance
SQL-Datenbank in Microsoft Fabric
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.
Randeinschränkungen
Standardmäßig erzwingen Kantentabellen nichts für die Endpunkte der Kante. Das heißt, eine Kante in einer Graphdatenbank könnte jeden Knoten mit jedem anderen Knoten verbinden, unabhängig vom Typ.
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 Kante auf diesen Knoten verweist.
Kanten-Nebenbedingungen
Eine einzelne Kantenbedingung besteht aus einer oder mehreren Kantenbedingungsklauseln.
CONSTRAINT constraint_name CONNECTION (cause1[, clause2...])
- Eine Klausel für Edgeeinschränkungen ist ein Paar von Knotentabellennamen, die durch das Schlüsselwort
TOgetrennt sind. - 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 Paar von Tabellennamen gibt daher die Richtung der Kantenbeziehung an.
- Wie bereits erwähnt, kann ein Edge-Constraint eine oder mehrere Edge-Constraint-Klauseln 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 davon kann über eine einzelne, gemeinsam genutzte Kantentabelle 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.
Examples
CONSTRAINT EC_BOUGHT CONNECTION (Customer TO Product)
Das obige Beispiel zeigt eine einzelne Edgeeinschränkung mit einer einzelnen Edgeeinschränkungsklausel. Diese Beschrä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 Beschränkungen für dieselbe Kantentabelle, wobei jede Kantenbeschränkung eine Beschränkungsklausel angibt. In dieser Situation lässt SQL nur Einfügungen zu, die beide Edge-Constraint-Klauseln gleichzeitig erfüllen. Dies ist nicht möglich. Es gibt kein Knotenpaar, das beide Edgeeinschränkungsklauseln erfüllen kann. Diese Kombination aus Kantenbeschränkungen macht die Kantentabelle 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 für Kanteneinschrä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 für Kanten-Constraints
Kaskadierende Aktionen für eine Edge-Einschränkung ermöglichen es Benutzern, festzulegen, welche Aktionen die Datenbank-Engine ausführt, wenn ein Benutzer den bzw. die Knoten löscht, mit denen die betreffende Edge verbunden ist. 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 Randbedingungen
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.
Kantenbeschränkungen erstellen
Die folgenden Beispiele zeigen, wie Sie einen Edge-Constraint auf neuen oder bestehenden Tabellen erstellen.
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;
Referenzaktionen für eine neue Kantentabelle definieren
Im folgenden Beispiel wird eine Randeinschränkung für die bought Randtabelle erstellt und die referentielle ON DELETE CASCADE-Aktion 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 Edge-Tabelle eine Edge-Einschränkung hinzu
Im folgenden Beispiel wird mit ALTER TABLE der bought-Kantentabelle eine Kantenbeschränkung hinzugefügt.
-- 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 neuen Edge-Constraint für eine vorhandene Edge-Tabelle mit zusätzlichen Edge-Constraint-Klauseln
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 vorangegangenen Beispiel gibt es in der Einschränkung EC_BOUGHT1 zwei Klauseln für Kanteneinschränkungen: eine, die Customer mit Product verbindet, und eine weitere, die Supplier mit Product verbindet. Beide Klauseln werden in Disjunktion angewendet. Das bedeutet, dass eine gegebene Kante eine dieser beiden Bedingungen erfüllen muss, um in die Kantentabelle aufgenommen 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
Stellen Sie sich im vorherigen Beispiel vor, dass wir nun auch die Beziehung zwischen Supplier und Product über die bought-Edge-Tabelle einbeziehen müssen. Sie können versuchen, eine neue Kantenbeschrä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 Kantentabelle mehr als eine Kantenbeschränkung hat, muss eine bestimmte Kante ALL Kantenbeschränkungen erfüllen, um in der Kantentabelle zulässig zu sein. Da hier keine Kante sowohl EC_BOUGHT als auch EC_BOUGHT1 erfüllen kann, schlägt die obige ALTER TABLE-Anweisung fehl, wenn die Edge-Tabelle bought überhaupt Zeilen enthält.
Damit diese Edge-Beschränkung erfolgreich erstellt werden kann, sollte wie in diesem Beispiel gezeigt eine bestimmte Reihenfolge eingehalten werden:
-- 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 eine Kante in der bought-Kante zulässig ist, muss sie eine der beiden Kantenbeschränkungsklauseln der Beschrä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.
Kanteneinschränkungen löschen
Das folgende Beispiel ermittelt zunächst den Namen des Edge-Constraints und löscht dieses anschließend.
-- 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;
Randbedingungen ändern
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.
Edge-Einschränkungen anzeigen
Die Sichtbarkeit der Metadaten in Katalogansichten ist auf sicherbare Objekte beschränkt, die ein Benutzer entweder besitzt oder für die ihm 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');