XML 스키마 컬렉션(SQL Server)

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

xml(Transact-SQL) 문서에 설명된 대로 SQL Server는 xml 데이터 형식을 통해 XML 데이터의 네이티브 스토리지를 제공합니다. 필요에 따라 XML 스키마 컬렉션을 통해 XSD 스키마를 변수 또는 xml 형식의 열과 연결할 수 있습니다. XML 스키마 컬렉션은 가져온 XML 스키마를 저장한 다음 다음을 수행하는 데 사용됩니다.

  • XML 인스턴스 유효성 검사

  • 데이터베이스에 저장될 때 XML 데이터 형식화

XML 스키마 컬렉션은 데이터베이스의 테이블과 같은 메타데이터 엔터티입니다. 만들고, 수정하고, 삭제할 수 있습니다. CREATE XML SCHEMA COLLECTION(Transact-SQL) 문에 지정된 스키마를 새로 만든 XML 스키마 컬렉션 개체로 자동으로 가져옵니다. ALTER XML SCHEMA COLLECTION(Transact-SQL) 문을 사용하여 데이터베이스의 기존 컬렉션 개체로 추가 스키마 또는 스키마 구성 요소를 가져올 수 있습니다.

형식화된 XML과 형식화되지 않은 XML 문서에 설명된 것과 같이 스키마가 연결된 열 또는 변수에 저장된 XML은 스키마가 인스턴스 데이터에 대해 필요한 데이터 형식 정보를 제공하기 때문에 형식화된 XML이라고 부릅니다. SQL Server는 이 형식 정보를 사용하여 데이터 스토리지를 최적화합니다.

쿼리 프로세싱 엔진은 또한 유형 검사 및 쿼리와 데이터 수정 최적화를 위해 스키마를 사용합니다.

또한 SQL Server는 XML 인스턴스의 유효성을 검사하기 위해 xml 형식이 지정된 연결된 XML 스키마 컬렉션을 사용합니다. XML 인스턴스가 스키마를 준수하는 경우 데이터베이스는 해당 형식 정보를 사용하여 인스턴스를 시스템에 저장할 수 있도록 허용합니다. 그렇지 않으면 인스턴스를 거부합니다.

내장 함수 XML_SCHEMA_NAMESPACE를 사용하여 데이터베이스에 저장된 스키마 컬렉션을 검색할 수 있습니다. 자세한 내용은 저장된 XML 스키마 컬렉션 보기를 참조하세요.

XML 스키마 컬렉션을 사용하여 XML 변수, 매개 변수 및 열을 형식화할 수 없습니다.

스키마 컬렉션 관리를 위한 DDL

데이터베이스에서 XML 스키마 컬렉션을 만들고 이를 xml 유형의 변수 및 열과 연결할 수 있습니다. 데이터베이스에서 스키마 컬렉션을 관리하기 위해 SQL Server는 다음 DDL 문을 제공합니다.

XML 스키마 컬렉션과 이 컬렉션에 포함된 스키마를 사용하려면 먼저 CREATE XML SCHEMA COLLECTION 문을 사용하여 컬렉션과 스키마를 만들어야 합니다. 스키마 컬렉션을 만들고 나면 xml 형식의 변수와 열을 만들고 스키마 컬렉션과 연결할 수 있습니다. 스키마 컬렉션을 만든 후에는 다양한 스키마 구성 요소가 메타데이터에 저장됩니다. ALTER XML SCHEMA COLLECTION을 사용하여 기존 스키마에 더 많은 구성 요소를 추가하거나 기존 컬렉션에 새 스키마를 추가할 수도 있습니다.

스키마 컬렉션을 삭제하려면 DROP XML SCHEMA COLLECTION 문을 사용합니다. 그러면 컬렉션에 포함된 모든 스키마가 삭제되고 컬렉션 개체가 제거됩니다. 스키마 컬렉션을 삭제하려면 DROP XML SCHEMA COLLECTION(Transact-SQL)에 설명된 조건이 충족되어야 합니다.

스키마 구성 요소 이해

CREATE XML SCHEMA COLLECTION 문을 사용하면 다양한 스키마 구성 요소를 데이터베이스로 가져옵니다. 스키마 구성 요소에는 스키마 요소, 특성 및 형식 정의가 포함됩니다. DROP XML SCHEMA COLLECTION 문을 사용하는 경우 전체 컬렉션이 제거됩니다.

CREATE XML SCHEMA COLLECTION은 여러 시스템 테이블에 스키마 구성 요소를 저장합니다.

예를 들어 다음 스키마를 생각해 볼 수 있습니다.

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="uri:Cust_Orders2"
            xmlns="uri:Cust_Orders2" >
  <xsd:attribute name="SomeAttribute" type="xsd:int" />
  <xsd:complexType name="SomeType" />
  <xsd:complexType name="OrderType" >
    <xsd:sequence>
      <xsd:element name="OrderDate" type="xsd:date" />
      <xsd:element name="RequiredDate" type="xsd:date" />
      <xsd:element name="ShippedDate" type="xsd:date" />
    </xsd:sequence>
    <xsd:attribute name="OrderID" type="xsd:ID" />
    <xsd:attribute name="CustomerID"  />
    <xsd:attribute name="EmployeeID"  />
  </xsd:complexType>
  <xsd:complexType name="CustomerType" >
     <xsd:sequence>
        <xsd:element name="Order" type="OrderType"
                     maxOccurs="unbounded" />
       </xsd:sequence>
      <xsd:attribute name="CustomerID" type="xsd:string" />
      <xsd:attribute name="OrderIDList" type="xsd:IDREFS" />
  </xsd:complexType>
  <xsd:element name="Customer" type="CustomerType" />
</xsd:schema>

이전 스키마는 데이터베이스에 저장할 수 있는 여러 유형의 구성 요소를 보여 줍니다. 여기에는 SomeAttribute, SomeType, OrderType, CustomerType, Customer, Order, CustomerID, OrderID, OrderDate, RequiredDate, ShippedDate 등이 포함됩니다.

구성 요소 범주

데이터베이스에 저장된 스키마 구성 요소는 다음 범주로 분류됩니다.

  • ELEMENT

  • ATTRIBUTE

  • TYPE(단순 또는 복합 형식의 경우)

  • ATTRIBUTEGROUP

  • MODELGROUP

예시:

  • SomeAttribute는 ATTRIBUTE 구성 요소입니다.

  • SomeType, OrderTypeCustomerType TYPE 구성 요소입니다.

  • Customer는 ELEMENT 구성 요소입니다.

데이터베이스로 스키마를 가져올 때 SQL Server는 스키마 자체를 저장하지 않습니다. 대신 SQL Server는 다양한 개별 구성 요소를 저장합니다. 즉, <스키마> 태그는 저장되지 않으며 이 태그 내에 정의된 구성 요소만 보관됩니다. 모든 스키마 요소는 유지되지 않습니다. <Schema> 태그에 해당 구성 요소의 기본 동작을 지정하는 특성이 포함된 경우 이러한 특성은 다음 표에 설명된 것과 같이 가져오기 프로세스 중에 태그 내에 있는 스키마 구성 요소로 이동됩니다.

Attribute name 동작
attributeFormDefault 아직 제공되지 않았고 값이 attributeFormDefault 특성의 값으로 설정된 스키마의 요소 선언에 적용된 form 특성입니다.
elementFormDefault 아직 제공되지 않았고 값이 elementFormDefault 특성의 값으로 설정된 스키마의 요소 선언에 적용된 form 특성입니다.
blockDefault 아직 제공되지 않았고 값이 blockDefault 특성의 값으로 설정된 모든 요소 선언 및 유형 정의에 적용된 block 특성입니다.
finalDefault 아직 제공되지 않았고 값이 finalDefault 특성의 값으로 설정된 모든 요소 선언 및 유형 정의에 적용된 final 특성입니다.
targetNamespace 대상 네임스페이스에 속하는 구성 요소에 대한 정보는 메타데이터에 저장됩니다.

XML 스키마 컬렉션에 대한 사용 권한

다음 작업을 수행하려면 필요한 권한이 있어야 합니다.

  • XML 스키마 컬렉션 만들기/로드

  • XML 스키마 컬렉션 수정

  • XML 스키마 컬렉션 삭제

  • XML 스키마 컬렉션을 사용하여 xml 형식 열, 변수 및 매개 변수를 입력하거나 테이블 또는 열 제약 조건에서 사용합니다

SQL Server 보안 모델에서는 모든 개체에 대한 CONTROL 권한이 허용됩니다. 이 사용 권한의 피부여자는 개체에 대한 모든 기타 사용 권한을 얻습니다. 개체의 소유자도 개체에 대한 모든 권한을 갖습니다.

개체에 대한 CONTROL 권한의 소유자와 피부여자는 개체에 대한 모든 권한을 부여할 수 있습니다. 소유자가 아니면서 CONTROL 권한이 없는 사용자는 WITH GRANT OPTION을 지정할 때 개체에 대한 사용 권한을 계속 부여할 수 있습니다. 예를 들어 WITH GRANT OPTION을 통해 사용자 A에게 XML 스키마 컬렉션 S에 대한 REFERENCES 권한이 있지만 S에 대한 다른 사용 권한이 없다고 가정해 보십시오. 이 경우 사용자 A는 사용자 B에게 스키마 컬렉션 S에 대한 REFERENCES 권한을 부여할 수 있습니다.

또한 보안 모델을 사용하면 XML 스키마 컬렉션을 만들고 사용하거나 한 사용자에서 다른 사용자로 소유권을 이전할 수 있습니다. 다음 문서에서는 XML 스키마 컬렉션 권한에 대해 설명합니다.

XML 스키마 및 스키마 컬렉션에 대한 정보 가져오기

XML 스키마 컬렉션은 카탈로그 뷰 sys.xml_schema_collections에 열거됩니다. XML 스키마 컬렉션 sys는 시스템에 의해 정의됩니다. 여기에는 명시적으로 로드하지 않고도 모든 사용자 정의 XML 스키마 컬렉션에서 사용할 수 있는 미리 정의된 네임스페이스가 포함되어 있습니다. 이 목록에는 xml, xs, xsi, fnxdt에 대한 네임스페이스가 포함됩니다. 다른 두 카탈로그 뷰는 각 XML 스키마 컬렉션 내의 모든 네임스페이스를 열거하는 sys.xml_schema_namespaces, 그리고 각 XML 스키마 내의 모든 XML 스키마 구성 요소를 열거하는 sys.xml_components입니다.

기본 제공 함수인 XML_SCHEMA_NAMESPACE, schemaName, XmlSchemacollectionName, namespace-urixml 데이터 형식 인스턴스를 생성합니다. 이 인스턴스에는 미리 정의된 XML 스키마를 제외하고 XML 스키마 컬렉션에 포함된 스키마에 대한 XML 스키마 조각이 포함되어 있습니다.

다음과 같은 방법으로 XML 스키마 컬렉션의 내용을 열거할 수 있습니다.

  • XML 스키마 컬렉션에 적합한 카탈로그 뷰에 Transact-SQL 쿼리를 작성합니다.

  • 기본 제공 함수 XML_SCHEMA_NAMESPACE()를 사용합니다. 이 함수의 출력에 xml 데이터 형식 메서드를 적용할 수 있습니다. 그러나 기본 XML 스키마는 수정할 수 없습니다.

이러한 내용은 다음 예시에 설명되어 있습니다.

예제

XML 스키마 컬렉션에서 XML 네임스페이스 열거

XML 스키마 컬렉션 myCollection에 대해 다음 쿼리를 사용합니다.

SELECT XSN.name
FROM    sys.xml_schema_collections XSC JOIN sys.xml_schema_namespaces XSN
    ON (XSC.xml_collection_id = XSN.xml_collection_id)
WHERE    XSC.name = 'myCollection';

XML 스키마 컬렉션의 콘텐츠 열거

다음 문은 관계형 스키마 dbo 내에서 XML 스키마 컬렉션 myCollection의 콘텐츠를 열거합니다.

SELECT XML_SCHEMA_NAMESPACE (N'dbo', N'myCollection');

대상 네임스페이스를 XML_SCHEMA_NAMESPACE()에 대한 세 번째 인수로 지정하여 컬렉션 내의 개별 XML 스키마를 xml 데이터 형식 인스턴스로 가져올 수 있습니다. 이 방법은 다음 예제에서 확인할 수 있습니다.

XML 스키마 컬렉션에서 지정된 스키마 출력

다음 문은 관계형 스키마 dbo 내의 XML 스키마 컬렉션 myCollection에서 가장 대상 네임스페이스 https://www.microsoft.com/was-books를 사용하여 XML 스키마를 출력합니다.

SELECT XML_SCHEMA_NAMESPACE (N'dbo', N'myCollection',
N'https://www.microsoft.com/was-books')

XML 스키마 쿼리

XML 스키마 컬렉션에 로드한 XML 스키마는 다음과 같은 방법으로 쿼리할 수 있습니다.

  • XML 스키마 네임스페이스에 대한 카탈로그 뷰에 Transact-SQL 쿼리를 작성합니다.

  • xml 데이터 형식의 열이 포함된 테이블을 만들어서 XML 스키마를 저장하고 이를 XML 유형의 시스템으로 로드합니다. xml 데이터 형식의 메서드를 사용하여 XML 열을 쿼리할 수 있습니다. 또한 이 열에서 XML 인덱스를 작성할 수 있습니다. 하지만 이 접근 방식에서는 애플리케이션이 XML 열에 저장된 XML 스키마와 XML 유형 시스템 간의 일관성을 유지 관리해야 합니다. 예를 들어 XML 형식 시스템에서 XML 스키마 네임스페이스를 삭제하는 경우 일관성을 유지하기 위해 테이블에서 XML 스키마 네임스페이스를 삭제해야 합니다.

참고 항목