Batasan Azure Stack Edge
Berlaku untuk: SQL Server 2019 (15.x) dan azure SQL Database Azure 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 Customer
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 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_id
pasangan , $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');