다음을 통해 공유


에지 제약 조건

적용 대상: SQL Server 2019(15.x) 이후 버전 Azure SQL Database Azure 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);

앞 예제의 EC_BOUGHT1 제약 조건에 두 개의 에지 제약 조건 절이 있습니다. 하나는 CustomerProduct에 연결하고, 다른 하나는 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 에지 테이블을 통해 Supplier-Product 관계도 포함해야 한다고 상상해 보세요. 새 에지 제약 조건 추가를 시도할 수 있습니다.

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

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

이 에지 제약 조건을 성공적으로 만들도록 예정되는 방법은 이 샘플과 같이 시퀀스를 따르는 것입니다.

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

이전 제약 조건을 삭제하지 않고 먼저 새 "super-set" 제약 조건을 추가했으므로 작업이 메타데이터 전용 작업이 될 수 있습니다. 즉, 기존 제약 조건을 포함하므로 bought 테이블의 모든 기존 데이터를 확인할 필요가 없습니다.

이렇게 하면 지정된 에지가 bought 에지에서 허용되기 위해 EC_BOUGHT_NEW 제약 조건의 에지 제약 조건 절 중 하나를 충족해야 합니다. 따라서 유효한 CustomerProduct 노드에 연결하거나 SupplierProduct 노드에 연결하려는 모든 에지가 허용됩니다.

에지 제약 조건 삭제

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

-- 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을 참조하세요.

다음 예제에서는 tempdb 데이터베이스의 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;

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

다음 단계