Aracılığıyla paylaş


Kenar kısıtlamaları

Şunlar için geçerlidir: SQL Server 2019 (15.x) ve sonraki sürümleri Microsoft Fabric'teAzure SQL VeritabanıAzure SQL Yönetilen Örneği SQL veritabanı

Uç kısıtlamaları, SQL Server graf veritabanındaki kenar tablolarında veri bütünlüğünü ve belirli semantiği zorunlu kılmak için kullanılabilir.

Edge Kısıtlamaları

Varsayılan olarak, çizge tabloları kenarın uç noktaları için hiçbir şeyi zorlamaz. Başka bir deyişle, grafik veritabanındaki bir kenar türü ne olursa olsun herhangi bir düğümü başka bir düğüme bağlayabilir.

SQL Graph, kullanıcıların kenar tablolarına kısıtlamalar eklemesini ve böylece belirli semantiği zorunlu tutmasını ve veri bütünlüğünü korumasını sağlayan uç kısıtlamalarını destekler. Kenar kısıtlamaları olan bir kenar tablosuna yeni bir kenar eklendiğinde Veritabanı Altyapısı, kenarın bağlanmaya çalıştığı düğümlerin uygun düğüm tablolarında mevcut olmasını zorlar. Ayrıca, herhangi bir kenar bu düğüme referans veriyorsa, düğüm silinemez olması da sağlanır.

Edge Kısıtlama Cümlecikleri

Bir kenar kısıtlaması, bir veya daha fazla kenar kısıtlama cümlesinden oluşur.

CONSTRAINT constraint_name CONNECTION (cause1[, clause2...])
  • Kenar kısıtlama yan tümcesi, anahtar sözcüğüyle TO ayrılmış bir çift düğüm tablosu adıdır.
  • Kenar kısıtlama yan tümcesindeki ilk tablo adı, kenar ilişkisinin FROM düğüm tablosunun adıdır.
  • Kenar kısıtlama yan tümcesindeki ikinci tablo adı, kenar ilişkisinin TO düğüm tablosunun adıdır.
  • Bu nedenle tablo adları çifti, kenar ilişkisinin yönünü gösterir.
  • Daha önce belirtildiği gibi, bir kenar kısıtlaması bir veya daha fazla kenar kısıtlama cümlesi içerebilir.

Birden çok kısıtlama ve şartlar

  • Aynı kenar tablosu için tanımlanan birden çok kenar kısıtlaması bir AND işleçle zorunlu kılınır.
  • Birden fazla kenar kısıtlama yan tümcesi, aynı kenar kısıtlaması içinde tanımlanmış ve bir OR işleciyle uygulanır.

Grafınızdaki Supplier ve Customer düğümleri göz önünde bulundurun. Her biri, Product düğümüyle tek bir paylaşılan kenar tablosu bought aracılığıyla ilişkilendirilebilir. Kenar bought tablosu Customer-(bought)->Product ve Supplier-(bought)->Product ilişki türlerini destekler. Bu, birden çok kenar kısıtlama maddesine sahip tek bir kenar kısıtlaması kullanılarak gerçekleştirilebilir.

Examples
CONSTRAINT EC_BOUGHT CONNECTION (Customer TO Product)

Yukarıdaki örnekte, bir kenar kısıtlaması cümlesiyle gösterilen bir kenar kısıtlaması bulunmaktadır. Bu kısıtlama destekler Customer-(bought)->Product. Yani, bought'den Customer'ye giden bir Product kenar ilişkisi eklemeye izin verilir. gibi Supplier-(bought)->Productbaşka bir düğüm bileşimi eklemeye çalışırsanız, gerçek dünyada geçerli bir ilişki açıklasa bile başarısız olur.

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

Yukarıdaki örnekte, bir kenar kısıtlaması iki kenar kısıtlama yan tümcesiyle tanımlanmıştır. Bu kısıtlama yan tümceleri, kenarın bought ya da Supplier-(bought)->Product veya Customer-(bought)->Product ilişkilerini içermesine olanak sağlar. Tabloya başka herhangi bir kenar ilişkisi türü ekleme bought işlemi başarısız olur.

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

Yukarıdaki örnekte aynı kenar tablosunda iki kısıtlama gösterilmektedir ve her kenar kısıtlaması bir sınırlama yan tümcesi belirtmektedir. Bu durumda SQL yalnızca HER İkİ uç kısıtlama yan tümcesini aynı anda karşılayan eklemelere izin verir. Bu mümkün değil. Bu kenar kısıtlama hükümlerini karşılayan bir düğüm çifti yoktur. Bu kenar kısıtlaması bileşimi, kenar tablosunu kullanılamaz hale getirir.

Gerçek hayattaki bir senaryoda birden çok kenar kısıtlamasının nerede kullanılabileceğinin ayrıntılı açıklaması için bu sayfanın devamında yer alan "Mevcut kenar tablosunda yeni kenar kısıtlaması yan tümcesiyle yeni bir kenar kısıtlaması oluşturma" örneğine bakın.

Sınır kısıtlamalarında dizinler

Kenar kısıtlaması oluşturmak, kenar tablosunda $from_id ve $to_id sütunlarında otomatik olarak karşılık gelen bir dizin oluşturmaz. El ile $from_id, $to_id çifti üzerinde dizin oluşturmak, nokta arama sorguları veya OLTP iş yükünüz varsa, önerilir.

ON DELETE kenar kısıtlamalarındaki başvuru eylemleri

Kenar kısıtlaması üzerindeki basamaklı eylemler, kullanıcıların bir düğüm(ler)i silmesi durumunda, veritabanı motorunun bu düğümlerin bağlı olduğu kenar üzerinde alacağı eylemleri tanımlamasına olanak tanır. Aşağıdaki başvuru aksiyonları tanımlanabilir: EYLEM YOK Bağlantılı kenarlara sahip bir düğümü silmeye çalıştığınızda veritabanı motoru bir hata oluşturur.

CASCADE Bir düğüm veritabanından silindiğinde, bağlantılı kenarlar otomatik olarak silinir.

** Kenar kısıtlamalarıyla çalışma

Transact-SQL kullanarak SQL Server'da kenar kısıtlaması tanımlayabilirsiniz. Kenar kısıtlaması yalnızca grafik kenar tablosunda tanımlanabilir. Kenar kısıtlaması oluşturmak, silmek veya değiştirmek için tabloda ALTER izniniz olmalıdır.

Kenar kısıtlamaları oluşturma

Aşağıdaki örneklerde, yeni veya var olan tablolarda nasıl kenar kısıtlaması oluşturulacağı gösterilmektedir.

Yeni bir kenar tablosunda kenar kısıtlaması oluşturma

Aşağıdaki örnek, bought kenar tablosuna bir kenar kısıtlaması oluşturur.

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

Yeni bir kenar tablosunda başvuru eylemleri tanımlama

Aşağıdaki örnek, bought kenar tablosunda bir kenar kısıtlaması oluşturur ve ON DELETE CASCADE başvuru eylemini tanımlar.

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

Var olan bir kenar tablosuna kenar kısıtlaması ekleme

Aşağıdaki örnek, kenar tablosuna bir kenar kısıtlaması eklemek için bought ALTER TABLE kullanır.

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

Ek kenar kısıtlama yan tümceleriyle mevcut kenar tablosunda yeni bir kenar kısıtlaması oluşturma

Aşağıdaki örnek, kenar tablosundaki ALTER TABLE kenarında ek kenar kısıtlama yan tümceleri ile yeni bir kenar kısıtlaması eklemek için bought komutunu kullanır.

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

Yukarıdaki örnekte, EC_BOUGHT1 kısıtlamasında iki kenar kısıtlama yan tümcesi vardır: biri Customer öğesini Product öğesine bağlar ve diğeri Supplier öğesini Product öğesine bağlar. Bu iki yan tümce bağımsız olarak uygulanır. Başka bir ifadeyle, belirli bir kenarın, kenar tablosuna dahil edilmesi için bu iki koşuldan birini sağlaması gerekir.

Mevcut kenar tablosunda, yeni kenar kısıtlama yan tümcesiyle birlikte yeni bir kenar kısıtlaması oluşturma

Aşağıdaki örnek, ALTER TABLE komutunu kullanarak bought edge tablosuna yeni bir kenar kısıtlama yan tümcesiyle yeni bir kenar kısıtlaması ekler.

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

Önceki örnekte, Supplier kenar tablosu aracılığıyla Product ve bought ilişkisini de eklememiz gerektiğini düşünün. Yeni bir kenar kısıtlaması eklemeyi deneyebilirsiniz:

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

Ancak yeni kenar kısıtlaması eklemek doğru çözüm değildir. Kenar tablosunda bought ve EC_BOUGHTüzerinde EC_BOUGHT1 iki ayrı kenar kısıtlaması oluşturduk. Bu kenar kısıtlamalarının her ikisi de farklı kenar kısıtlama yan tümcelerine sahiptir. Bir kenar tablosunun üzerinde birden fazla kenar kısıtlaması varsa, belirli bir kenarın kenar tablosunda izin verilmesi için TÜM kenar kısıtlamalarını karşılaması gerekir. Hiçbir kenar EC_BOUGHT ve EC_BOUGHT1 koşullarını sağlayamadığından, kenar tablosunda herhangi bir satır varsa yukarıdaki ALTER TABLE belirtimi başarısız olur.

Bu kenar kısıtlamasının başarıyla oluşturulabilmesi için, bu örnekte gösterildiği üzere izlenmesi gereken bir dizi vardır:

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

Yeni "süper küme" kısıtlamasını öncekini bırakmadan ilk olarak eklemiş olmamız, işlemin yalnızca meta veri işlemi olmasına olanak tanır; var olan kısıtlamayı kapsadığından tablodaki bought tüm mevcut verileri denetlemesi gerekmez.

Buna göre, belirli bir kenarın bought kenarında kullanılmasına izin verilmesi için EC_BOUGHT_NEW kısıtlama içindeki kenar kısıtlama hükümlerinden birini karşılaması gerekir. Bu nedenle, geçerli Customer ve Product veya Supplier ve Product düğümlerine bağlanmaya çalışan herhangi bir kenara izin verilir.

Kenar kısıtlamalarını silme

Aşağıdaki örnek önce kenar kısıtlamasının adını tanımlar ve ardından kısıtlamayı siler.

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

Kenar kısıtlamalarını değiştirme

Transact-SQL kullanarak kenar kısıtlamasını değiştirmek için önce mevcut kenar kısıtlamasını silmeniz ve ardından yeni tanım ile yeniden oluşturmanız gerekir.

Kenar kısıtlamalarını görüntüleme

Katalog görünümlerindeki meta verilerin görünürlüğü, kullanıcının sahip olduğu veya kullanıcıya bazı izinlerin verildiği güvenli hale getirilebilir öğelerle sınırlıdır. Daha fazla bilgi için bkz. meta veri görünürlüğü yapılandırması .

Örnek, veritabanındaki kenar tablosu boughttempdb için tüm kenar kısıtlamalarını ve bunların özelliklerini döndürür.

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

Sonraki Adımlar