에지 제약 조건
적용 대상: 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
연산자를 사용하여 적용됩니다.
그래프의 Supplier
및 Customer
노드를 고려합니다. 각각 단일 공유 에지 테이블인 bought
에 의해 Product
노드와 관계될 수 있습니다. bought
에지 테이블은 Customer-(bought)->Product
및 Supplier-(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
제약 조건에 두 개의 에지 제약 조건 절이 있습니다. 하나는 Customer
를 Product
에 연결하고, 다른 하나는 Supplier
를 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;
GO
앞의 예제에서 이제 bought
에지 테이블을 통해 Supplier
-Product
관계도 포함해야 한다고 상상해 보세요. 새 에지 제약 조건 추가를 시도할 수 있습니다.
ALTER TABLE bought ADD CONSTRAINT EC_BOUGHT1 CONNECTION (Supplier TO Product);
그러나 새 에지 제약 조건을 추가하는 것은 올바른 해답이 아닙니다. bought
에지 테이블에 대한 별도의 두 에지 제약 조건(EC_BOUGHT
및 EC_BOUGHT1
)을 만들었습니다. 이러한 두 에지 제약 조건 모에는 서로 다른 에지 제약 조건 절이 있습니다. 에지 테이블에 둘 이상의 에지 제약 조건이 있는 경우 지정된 에지는 에지 테이블에서 허용되는 모든 에지 제약 조건을 충족해야 합니다. 여기에는 EC_BOUGHT
및 EC_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
제약 조건의 에지 제약 조건 절 중 하나를 충족해야 합니다. 따라서 유효한 Customer
를 Product
노드에 연결하거나 Supplier
를 Product
노드에 연결하려는 모든 에지가 허용됩니다.
에지 제약 조건 삭제
다음 예제에서는 먼저 에지 제약 조건의 이름을 식별한 후 해당 제약 조건을 삭제합니다.
-- 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');