에지 제약 조건

적용 대상: SQL Server 2019(15.x) 이상 Azure SQL DatabaseAzure SQL Managed Instance

에지 제약 조건을 사용하여 SQL Server 그래프 데이터베이스의 에지 테이블에 데이터 무결성 및 특정 의미 체계를 적용할 수 있습니다.

에지 제약 조건

기본적으로 에지 테이블은 에지의 엔드포인트에 대해 아무 것도 적용하지 않습니다. 즉, 그래프 데이터베이스의 에지는 형식에 관계없이 모든 노드를 다른 노드에 연결할 수 있습니다.

SQL Graph는 사용자가 에지 테이블에 제약 조건을 추가할 수 있도록 하는 에지 제약 조건을 지원하여 특정 의미 체계를 적용하고 데이터 무결성을 유지할 수 있도록 합니다. 에지 제약 조건이 있는 에지 테이블에 새 에지가 추가되면 데이터베이스 엔진 에지가 연결하려는 노드가 적절한 노드 테이블에 존재하도록 강제합니다. 또한 에지가 해당 노드를 참조하는 경우 노드를 삭제할 수 없습니다.

에지 제약 조건 절

단일 에지 제약 조건은 하나 이상의 에지 제약 조건 절로 이루어집니다.

CONSTRAINT constraint_name CONNECTION (cause1[, clause2...])
  • 에지 제약 조건 절은 TO 키워드로 구분되는 노드 테이블 이름의 쌍입니다.
  • 에지 제약 조건 절의 첫 번째 테이블 이름은 에지 관계에 대한 FROM 노드 테이블의 이름입니다.
  • 에지 제약 조건 절의 두 번째 테이블 이름은 에지 관계에 대한 TO 노드 테이블의 이름입니다.
  • 따라서 테이블 이름 쌍은 에지 관계의 방향을 나타냅니다.
  • 앞서 언급했듯이 에지 제약 조건에는 하나 이상의 에지 제약 조건 절이 포함될 수 있습니다.

여러 제약 조건 및 절

  • 여러 에지 제약 조건은 동일한 에지 테이블에 대해 정의되며 AND 연산자로 시행됩니다.
  • 동일한 에지 제약 조건 내에 정의된 여러 에지 제약 조건 절은 연산자를 사용하여 OR 적용됩니다.

그래프의 SupplierCustomer 노드를 고려합니다. 각각 단일 공유 에지 테이블인 bought에 의해 Product 노드와 관계될 수 있습니다. bought 에지 테이블은 Customer-(bought)->ProductSupplier-(bought)->Product 관계 유형을 지원합니다. 여러 에지 제약 조건 절이 있는 단일 에지 제약 조건을 사용하여 이 작업을 수행할 수 있습니다.

예제
CONSTRAINT EC_BOUGHT CONNECTION (Customer TO Product)

위의 예제는 에지 제약 조건 하나가 있는 에지 제약 조건 절 하나를 보여줍니다. 이 제약 조건은 Customer-(bought)->Product를 지원합니다. 즉, Customer에서 Product로 향하는 bought 에지 관계를 삽입할 수 있습니다. 실제 환경에서 유효한 관계를 설명할 수 있더라도 노드 Supplier-(bought)->Product의 다른 조합을 삽입하려고 하면 실패합니다.

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

위의 예제는 두 개의 에지 제약 조건 절을 사용하여 하나의 에지 제약 조건을 정의합니다. 이러한 제약 조건 절을 사용하면 bought 에지가 Supplier-(bought)->Product 또는 Customer-(bought)->Product 관계를 포함할 수 있습니다. 다른 에지 관계 유형을 bought 테이블에 삽입할 수는 없습니다.

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

위의 예에서는 동일한 에지 테이블에 있는 두 개의 제약 조건을 보여주며 각 에지 제약 조건은 하나의 제약 조건 절을 지정합니다. 이 경우 SQL은 양쪽 에지 제약 조건 절을 동시에 충족하는 삽입만 허용합니다. 이것은 불가능합니다. 두 에지 제약 조건 절을 모두 충족할 수 있는 노드 쌍은 없습니다. 이러한 제약 조건 조합은 에지 테이블을 사용할 수 없게 만듭니다.

실제 시나리오에서 여러 에지 제약 조건을 사용할 수 있는 위치에 대한 자세한 설명은 이 페이지의 뒷부분에 있는 "새 에지 제약 조건 절을 사용하여 기존 에지 테이블에 새 에지 제약 조건 만들기" 예제를 참조하세요.

에지 제약 조건의 인덱스

에지 제약 조건을 만들면 에지 테이블에 해당 인덱 $from_id 스 및 $to_id 열이 자동으로 만들어지지 않습니다. 지점 조회 쿼리 또는 OLTP 워크로드가 있는 경우 수동으로 인덱 $from_id$to_id 스를 만드는 것이 좋습니다.

에지 제약 조건에 대한 ON DELETE 참조 동작

에지 제약 조건에 연계 동작을 사용하면 사용자는 지정된 에지가 연결되는 노드를 삭제할 때 데이터베이스 엔진이 수행하는 동작을 정의할 수 있습니다. 다음 참조 동작을 정의할 수 있습니다. NO ACTION 연결하는 에지가 있는 노드를 삭제하려고 하면 데이터베이스 엔진에서 오류를 발생시킵니다.

CASCADE 데이터베이스에서 노드를 삭제하면 연결하는 에지가 삭제됩니다.

에지 제약 조건 작업

TransactSQL을 사용하여 SQL Server에서 에지 제약 조건을 정의할 수 있습니다. 에지 제약 조건은 그래프 에지 테이블에만 정의할 수 있습니다. 에지 제약 조건을 만들거나 삭제하거나 수정하려면 테이블에 대한 ALTER 권한이 있어야 합니다.

에지 제약 조건 만들기

다음 예제에서는 기존 또는 새 테이블에 에지 제약 조건을 만드는 방법을 보여 줍니다.

새 에지 테이블에 에지 제약 조건 만들기

다음 예제에서는 에지 테이블에 에지 제약 조건을 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;

새 에지 테이블에서 참조 작업 정의

다음 예제에서는 에지 테이블에 에지 제약 bought 조건을 만들고 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;

기존 에지 테이블에 에지 제약 조건 추가

다음 예제에서는 ALTER TABLE을 사용하여 에지 테이블에 에지 제약 조건을 bought 추가합니다.

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

추가 에지 제약 조건 절을 사용하여 기존 에지 테이블에 새 에지 제약 조건 만들기

다음 예제에서는 이 명령을 사용하여 ALTER TABLE 에지 테이블에 추가 에지 제약 조건 절이 있는 새 에지 제약 조건을 추가합니다 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);

앞의 예제에는 제약 조건에 연결하고 다른 절에 연결하는 CustomerProduct 두 개의 에지 제약 조건 절 EC_BOUGHT1 이 있습니다 SupplierProduct. 이러한 절은 모두 분리에 적용됩니다. 즉, 지정된 에지는 에지 테이블에서 허용되는 두 절 중 하나를 충족해야 합니다.

새 에지 제약 조건 절을 사용하여 기존 에지 테이블에 새 에지 제약 조건 만들기

다음 예제에서는 이 명령을 사용하여 ALTER TABLE 에지 테이블에 새 에지 제약 조건 절 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

앞의 예제에서 이제 에지 테이블을 통해 bought to Product 관계도 포함 Supplier 해야 한다고 상상해 보십시오. 새 에지 제약 조건을 추가해 볼 수 있습니다.

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

그러나 새 에지 제약 조건을 추가하는 것은 올바른 솔루션이 아닙니다. 에지 테이블에 EC_BOUGHTEC_BOUGHT1두 개의 별도 에지 제약 조건을 bought 만들었습니다. 이러한 에지 제약 조건에는 서로 다른 에지 제약 조건 절이 있습니다. 에지 테이블에 둘 이상의 에지 제약 조건이 있는 경우 에지 테이블에서 허용되는 모든 에지 제약 조건을 충족해야 합니다. 에지가 둘 다 EC_BOUGHTEC_BOUGHT1 충족할 수 없으므로 에지 테이블에 행이 있으면 위의 ALTER TABLE 문이 실패합니다 bought .

이 에지 제약 조건을 성공적으로 만들려면 이 샘플에 표시된 대로 시퀀스를 따릅니다.

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

이전 제약 조건을 삭제하지 않고 새 "슈퍼 집합" 제약 조건을 먼저 추가했으므로 작업이 메타데이터 전용 작업이 될 수 있습니다. 기존 제약 조건을 포함하므로 테이블의 모든 기존 데이터를 bought 검사 필요가 없습니다.

이 경우 지정된 에지가 에지에서 bought 허용되려면 제약 조건의 에지 제약 조건 절 중 하나를 충족해야 합니다 EC_BOUGHT_NEW . 따라서 노드에 ProductSupplier 또는 노드에 유효한 CustomerProduct 연결을 시도하는 모든 에지가 허용됩니다.

에지 제약 조건 삭제

다음 예제에서는 먼저 에지 제약 조건의 이름을 식별한 후 해당 제약 조건을 삭제합니다.

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

에지 제약 조건 수정

Transact-SQL을 사용하여 에지 제약 조건을 수정하려면 먼저 기존 에지 제약 조건을 삭제한 다음 새 정의로 다시 만들어야 합니다.

에지 제약 조건 보기

카탈로그 뷰에서 메타데이터의 표시 유형은 사용자가 소유하거나 사용자에게 일부 권한이 부여된 보안 개체로 제한됩니다. 자세한 내용은 Metadata Visibility Configuration을 참조하세요.

이 예제에서는 데이터베이스의 에지 테이블에 boughttempdb 대한 모든 에지 제약 조건 및 해당 속성을 반환합니다.

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

다음 단계