Batasan Azure Stack Edge

Berlaku untuk: SQL Server 2019 (15.x) dan azure SQL DatabaseAzure SQL Managed Instance yang lebih baru

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

Batasan Edge

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 batasan tepi, Mesin Database memberlakukan bahwa simpul yang coba disambungkan 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 TO oleh 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 ditentukan dalam batasan tepi yang sama, diberlakukan 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 tepi mendukung Customer-(bought)->Product dan Supplier-(bought)->Product jenis hubungan. Ini dapat dicapai menggunakan batasan tepi tunggal dengan beberapa klausa batasan tepi.

Contoh
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 bought hubungan tepi dari ke CustomerProduct 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 batasan ini memungkinkan bought tepi berisi 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 sisipan yang memenuhi klausul batasan tepi KEDUANYA 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 batasan tepi tidak secara otomatis membuat indeks $from_id dan $to_id kolom yang sesuai di tabel edge. Membuat indeks secara manual pada $from_idpasangan , $to_id disarankan jika Anda memiliki kueri pencarian titik atau beban kerja OLTP.

TINDAKAN referensial ON DELETE pada batasan tepi

Tindakan berskala pada batasan tepi memungkinkan pengguna menentukan tindakan yang diambil mesin database saat pengguna menghapus simpul, yang disambungkan oleh tepi yang diberikan. 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 tepi

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 tepi pada bought tabel 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 ALTER TABLE perintah untuk menambahkan batasan tepi baru dengan klausa batasan tepi tambahan pada bought tabel edge.

-- 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 disjunction. 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 untuk menambahkan batasan tepi baru dengan klausa ALTER TABLE batasan tepi baru pada bought tabel edge.

-- 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 perlu juga menyertakan Supplier hubungan ke Product , melalui bought tabel tepi. 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 keduanya EC_BOUGHT dan EC_BOUGHT1 di sini, pernyataan di atas ALTER TABLE gagal jika ada baris sama sekali di bought tabel edge.

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.

Dengan ini, agar tepi tertentu diizinkan di bought tepi, tepi harus memenuhi salah satu klausa batasan tepi dalam EC_BOUGHT_NEW batasan. Oleh karena itu setiap tepi yang mencoba menyambungkan valid Customer ke Product atau Supplier ke Product simpul, 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 keamanan 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 berikutnya