Makale Özeti

Yazı dizisinin bir önceki bölümünde SQL Server 2005 ("Yukon") da bizi bekleyen yeni veri türü olan XML veri türünü ele almıştık. Bu bölümde ise bir önceki bölümde kısaca bahsettiğimiz XML Şemalarının kullanımına ve yönetimine değiniyor olacağız..

Makale

XML Şema Yönetimi
Veri türü XML olarak tanımlanmış her alan, bir XML şeması ile ilişkilendirilebilir. Böylece constraintler ve insert, update işlemleri doğrulanabilir, aynı zamanda depolama ve sorgu işlem (query processing) işlemlerinde optimizasyonlar sağlanabilir.

Şema Yönetimi için mevcut DDLler
SQL Server 2005 ("Yukon") şema yönetimini sağlamak amacıyla pek çok Data Definition Language (DDL) ifadesi sağlamaktadır.

Şema Oluşturmak
En temel yönetimsel işlem elbette bir şemanın register edilmesi ve böylece XML türündeki alanlarla birlikte kullanılabilmesidir. Şema oluşturma ve kayıt etme işlemlerini şu şekilde gerçekleştirebiliriz:
Sözdizimi:

CREATE XMLSCHEMA {SEMA_METNI}

Metni doğrudan girebilir veya bir değişken kullanabilirsiniz.

CREATE XMLSCHEMA
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://msdn.Microsoft®.com/schemas/sample/books">
   <xsd:element name="catalog">
   <xsd:complexType>
   <xsd:sequence>
   <xsd:element name="book" minOccurs="0" maxOccurs="unbounded">
   <xsd:complexType>
   <xsd:sequence>
   <xsd:element name="author" type="xsd:string"/>
   <xsd:element name="title" type="xsd:string"/>
   <xsd:element name="genre" type="xsd:string"/>
   <xsd:element name="price" type="xsd:float"/>
   <xsd:element name="publish_date" type="xsd:date"/>
   <xsd:element name="description" type="xsd:string"/>
   </xsd:sequence>
   <xsd:attribute name="id" type="xsd:string"/>
   </xsd:complexType>
   </xsd:element>
   </xsd:sequence>
   </xsd:complexType>
   </xsd:element>
</xsd:schema>

Şema, veritabanına eklenmediğinde, ELEMENT, ATTRIBUTE, TYPE, ATTRIBUTEGROUP ve MODELGROUP gibi pek çok bileşene ayrılır. Bu bileşenler ve ilişkilendirilmiş namespaceler farklı sistem tablolarında saklanır. Bu bileşenleri, özel sistem viewlarını kullanarak görüntüleyebilirsiniz. (Bu konuyu "Şema Bileşenlerinin Görüntülenmesi" başlığı altında inceliyor olacağız.)

Bunun iki farklı sonucu vardır. İlki SCHEMA etiketi ve bu etikete bağlı öznitelikler kayıt edilmeyecektir ancak etiketin öznitelikleri (targetNamespace, attributeFormDefault, elementFormDefault vb.) şemanın bileşenlerine yeniden assign atanır. Aynı zamanda SQL Server 2005 "Yukon", şema dokumanının import edildikten sonra görüntülenmesini sağlayan bir bileşen sunmamaktadır. Bu koşul için önerilen çözüm, bu iş için ayrılmış bir tabloda tüm şemaları ve içeriklerini saklamanızdır. Bu işlem için nvarchar ve xml veri türlerinin kullanımı yeterli olacaktır. Daha sonra şemayı aşağıdaki sorguyu kullanarak elde edebilirsiniz: 

CREATE XMLSCHEMA AS SELECT SchemaDoc FROM Schemas

(Elbette bu örnekteki isimler isteğe göre belirlenebilir.)

Şemaların Silinmesi
Şemaları veya şemaya ait elemanları silmek isteyebilirsiniz. Bu işleme ait sözdizimi şu şekildedir:

DROP XMLSCHEMA {NAMESPACE HedefAlanAdi}

Örneğin, book catalog şemasını tümüyle silmek için kullanacağımız ifade şu şekildedir:

DROP XMLSCHEMA NAMESPACE http://msdn.microsoft.com/schemas/sample/books

Eğer şemayı kullanan  (refere eden) herhangi bir sütun mevcutsa, şemayı silemezsiniz. Bu durumda ilk olarak ALTER TABLE ifadesini kullanarak silmek istediğiniz şemaya olan tüm referansları silmeniz daha sonra şemayı silmeniz gerekecektir.

Şema Bileşenlerinin Görüntülenmesi
Önceki paragraflarda şema içeriğinin farklı bileşenler halinde farklı sistem tablolarında saklandığını ve bu bileşenleri görüntülemek için SQL Server 2005 "Yukon" un bize sistem viewları sağladığını söylemiştik. Bu bölümde bu sistem viewlarının en sık kullanılan altı tanesini inceliyor olacağız.

Aşağıdaki tabloda her bir viewı ve açıklamasını görebilirsiniz.

View Açıklama
sys.xml_namespaces Şema kayıt işlemlerinde kullanılan ana tablo. Şema adresini name alanında bulundurur.
sys.xml_components Tüm şema bileşenleri için ana tablo. En önemli sütunlar foreign key olarak xml_namespace_id, şema bileşeninin adı (name) ve diğer dört viewa yönelik symbol_space alanı. (örneğin element için E, attribute için A, type için T, Model Group için M vb..)
sys.xml_elements Tüm şema elemanlarını içerir.
sys.xml_attributes Tüm şema özniteliklerini içerir.
sys.xml_types Tüm şema türlerini içerir.
sys.xml_model_groups Tüm şema model gruplarını içerir.

Son dört view sys.xml_components alanından sıklıkla ihtiyaç duyulan bazı alanları inherit eder ve spesifik içerik türüne özgü alanlar sağlar. Aşağıdaki grafikte bu viewların birbirleri ile ilişkileri görüntülenmektedir:

Bu temel overview ile kayıtlı şemalarla ilgili görmek istediğiniz tüm bilgileri edinmek için oluşturacağınız sorgularda viewlarla birlikte JOIN ifadesinide kullanabilirsiniz. Örneğin, aşağıdaki sorgu IndividualSurvey şemasındaki tüm elemanları listelemektedir.

SELECT e.name AS Elements
FROM sys.xml_elements e
JOIN sys.xml_namespaces n ON e.xml_namespace_id = n.xml_namespace_id
WHERE n.name = http://schemas.adventure-works.com/Individual/Survey

Öneri ve Kısıtlamalar
SQL Server üzerinde saklanan XML şemaları şu kısıtlamalara tabidir:

   - Notasyonlar veritabanında saklanmaz.
   - Unique, Key ve Keyref kullanan şemalar desteklenmez.
   - length, minlength ve maxlength verileri Long olarak saklanır.
   - TotalDigits değeri en fazla 38 basamaklı olabilir. (SQL Server decimal türü)
   - Kullanıcılar standart namespaceler; xml, xs, xf, xsi ve sqlTypes için şema yüklemek zorunda değillerdir.
   - Son olarak redefine etiketini içeren şema dokumanları kayıt edilemez.


Yazı dizimizin ilk bölümünde SQL Server 2005 ile tanışacağımız yeni veri türü olan XML veri türünü bu bölümde ise XML Şemalarının Kullanımı ve Yönetimini konularını ele aldık. Bir sonraki bölümde ise SQL Server 2005 ile tanışacağımız yeni sorgulama dili XQUERY konusunu ele alıyor olacağız.

Kadir Sümerkent
kadirs@yazgelistir.com