Edgeeinschränkungen
Gilt für: SQL Server 2019 (15.x) und höher Azure SQL-Datenbank Azure 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 bought
erstellt: 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');