Bagikan melalui


Pembatasan batas tepi

Berlaku untuk: SQL Server 2019 (15.x) dan versi yang lebih baru database Azure SQL DatabaseAzure SQL Managed InstanceSQL di Microsoft Fabric

Batasan edge dapat digunakan untuk memberlakukan integritas data dan semantik tertentu pada tabel edge dalam database grafik SQL Server.

Batasan Ujung

Secara default, tabel edge tidak memberlakukan apa pun untuk titik akhir tepi. Artinya, tepi dalam database grafik dapat menghubungkan simpul apa pun ke simpul lain, terlepas dari jenisnya.

SQL Graph mendukung batasan tepi, yang memungkinkan pengguna menambahkan batasan ke tabel edge mereka, sehingga memberlakukan semantik tertentu dan juga mempertahankan integritas data. Saat tepi baru ditambahkan ke tabel edge dengan kendala tepi, Mesin Basis Data memastikan bahwa simpul yang dihubungkan oleh tepi ada di tabel simpul yang tepat. Ini juga dipastikan bahwa simpul tidak dapat dihilangkan, jika ada tepi yang merujuk pada simpul tersebut.

Klausul Batasan Edge

Batasan tepi tunggal terdiri dari satu atau beberapa klausa batasan tepi.

CONSTRAINT constraint_name CONNECTION (cause1[, clause2...])
  • Klausa batasan tepi adalah sepasang nama tabel simpul, dipisahkan oleh TO kata kunci.
  • Nama tabel pertama dalam klausa batasan tepi adalah nama tabel simpul FROM untuk hubungan tepi.
  • Nama tabel kedua dalam klausa batasan tepi adalah nama tabel simpul TO untuk hubungan tepi.
  • Oleh karena itu, pasangan nama tabel menunjukkan arah hubungan tepi.
  • Seperti yang dinyatakan sebelumnya, batasan tepi dapat berisi satu atau beberapa klausa batasan tepi.

Beberapa batasan dan klausa

  • Beberapa batasan tepi, yang ditentukan untuk tabel tepi yang sama, diberlakukan dengan AND operator.
  • Beberapa klausa batasan tepi, yang didefinisikan dalam batasan tepi yang sama, dilaksanakan dengan OR operator.

Pertimbangkan simpul Supplier dan Customer dalam grafik Anda. Masing-masing dapat terkait dengan simpul Product dengan satu tabel tepi bersama: bought. Tabel bought edge mendukung Customer-(bought)->Product dan Supplier-(bought)->Product tipe hubungan. Ini dapat dicapai menggunakan batasan tepi tunggal dengan beberapa klausa batasan tepi.

Examples
CONSTRAINT EC_BOUGHT CONNECTION (Customer TO Product)

Contoh di atas menunjukkan satu batasan tepi, dengan satu klausa batasan tepi. Batasan ini mendukung Customer-(bought)->Product. Artinya, memasukkan hubungan tepi bought yang berasal dari Customer ke Product akan diizinkan. Jika Anda mencoba menyisipkan kombinasi node lain, seperti Supplier-(bought)->Product, meskipun dapat menggambarkan hubungan yang valid di dunia nyata, akan gagal.

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

Contoh di atas menentukan satu batasan tepi dengan dua klausa batasan tepi. Klausa pembatas ini memungkinkan tepi bought mengandung hubungan Supplier-(bought)->Product atau Customer-(bought)->Product. Menyisipkan jenis hubungan tepi lainnya ke bought dalam tabel akan gagal.

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

Contoh di atas menunjukkan dua batasan pada tabel tepi yang sama, dengan setiap batasan tepi menentukan satu klausa batasan. Dalam situasi ini, SQL hanya akan memungkinkan penyisipan yang memenuhi klausul pembatasan tepi secara bersamaan. Ini tidak mungkin. Tidak ada pasangan simpul yang dapat memenuhi kedua klausa batasan tepi. Kombinasi batasan tepi ini membuat tabel edge tidak dapat digunakan.

Untuk penjelasan terperinci tentang di mana beberapa batasan tepi dapat digunakan dalam skenario kehidupan nyata, lihat contoh "Membuat batasan tepi baru pada tabel tepi yang ada, dengan klausa batasan tepi baru" nanti di halaman ini.

Indeks pada batasan tepi

Membuat kekangan tepi tidak secara otomatis membuat indeks yang sesuai pada kolom $from_id dan $to_id di tabel tepi. Membuat indeks secara manual pada pasangan $from_id, $to_id disarankan jika Anda memiliki kueri pencarian poin atau beban kerja OLTP.

Tindakan referensial ON DELETE pada batasan edge

Tindakan berantai pada keterbatasan edge memungkinkan pengguna menentukan tindakan yang diambil mesin database saat pengguna menghapus simpul-simpul yang dihubungkan oleh edge tersebut. Tindakan referensial berikut dapat ditentukan: TIDAK ADA TINDAKAN Mesin database menimbulkan kesalahan saat Anda mencoba menghapus simpul yang memiliki tepi penghubung.

CASCADE Saat simpul dihapus dari database, tepi penghubung akan dihapus.

Bekerja dengan batasan pada tepi jaringan

Anda dapat menentukan batasan tepi di SQL Server dengan menggunakan Transact-SQL. Batasan tepi hanya dapat ditentukan pada tabel tepi grafik. Untuk membuat, menghapus, atau mengubah batasan tepi, Anda harus memiliki izin UBAH pada tabel.

Membuat batasan tepi

Contoh berikut menunjukkan kepada Anda cara membuat batasan tepi pada tabel baru atau yang sudah ada.

Membuat batasan tepi pada tabel edge baru

Contoh berikut membuat batasan sisi pada tabel bought edge.

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

Menentukan tindakan referensial pada tabel edge baru

Contoh berikut membuat batasan tepi pada bought tabel edge dan menentukan tindakan referensial ON DELETE CASCADE.

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

Menambahkan batasan tepi ke tabel tepi yang sudah ada

Contoh berikut menggunakan ALTER TABLE untuk menambahkan batasan tepi ke bought tabel edge.

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

Buat batasan tepi baru pada tabel edge yang ada, dengan klausa batasan tepi tambahan

Contoh berikut menggunakan perintah ALTER TABLE untuk menambahkan batasan tepi baru dengan klausa batasan tepi tambahan pada tabel bought.

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

Dalam contoh sebelumnya, ada dua klausa batasan tepi dalam EC_BOUGHT1 batasan, satu yang terhubung Customer ke Product dan lainnya terhubung Supplier ke Product. Kedua klausa ini diterapkan dalam bentuk disjungsi. Artinya, tepi tertentu harus memenuhi salah satu dari dua klausul ini untuk diizinkan dalam tabel edge.

Buat batasan tepi baru pada tabel tepi yang sudah ada, dengan klausa batasan tepi baru

Contoh berikut menggunakan perintah ALTER TABLE untuk menambahkan batasan tepi baru dengan klausa batasan tepi baru pada tabel bought.

-- 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

Dalam contoh sebelumnya, bayangkan bahwa kita sekarang juga perlu menyertakan relasi Supplier ke Product melalui tabel tepi bought. Anda dapat mencoba menambahkan batasan tepi baru:

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

Namun, menambahkan batasan tepi baru bukanlah solusi yang benar. Kami membuat dua batasan tepi terpisah pada bought tabel edge, EC_BOUGHT dan EC_BOUGHT1. Kedua batasan tepi ini memiliki klausa batasan tepi yang berbeda. Jika tabel tepi memiliki lebih dari satu batasan tepi di atasnya, tepi tertentu harus memenuhi semua batasan tepi untuk diizinkan dalam tabel tepi. Karena tidak ada tepi yang dapat memenuhi baik EC_BOUGHT maupun EC_BOUGHT1 di sini, pernyataan ALTER TABLE di atas gagal jika ada baris sama sekali di tabel edge bought.

Agar batasan tepi ini berhasil dibuat, cara yang ditentukan adalah mengikuti urutan seperti yang ditunjukkan dalam sampel ini:

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

Fakta bahwa kami menambahkan batasan "super-set" baru terlebih dahulu tanpa menghilangkan yang sebelumnya, memungkinkan operasi menjadi operasi khusus metadata - tidak perlu memeriksa semua data yang ada dalam bought tabel, karena mencakup batasan yang ada.

Oleh karena itu, agar tepi tertentu diizinkan di bought, tepi harus memenuhi salah satu klausa kendala dalam EC_BOUGHT_NEW kendala. Oleh karena itu, setiap tepi yang mencoba menyambungkan simpul Customer yang valid ke Product atau Supplier ke Product diizinkan.

Menghapus batasan tepi

Contoh berikut pertama-tama mengidentifikasi nama batasan tepi lalu menghapus batasan.

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

Mengubah batasan tepi

Untuk mengubah batasan tepi menggunakan Transact-SQL, Anda harus terlebih dahulu menghapus batasan tepi yang ada, lalu membuatnya kembali dengan definisi baru.

Melihat batasan tepi

Visibilitas metadata dalam tampilan katalog terbatas pada objek yang dapat diamankan yang dimiliki pengguna, atau di mana pengguna diberikan beberapa izin. Untuk informasi selengkapnya, lihat Konfigurasi Visibilitas Metadata.

Contoh mengembalikan semua batasan tepi dan propertinya untuk tabel bought edge dalam 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');

Langkah selanjutnya