Що дає репозитарій XML DB і як з ним працювати

… Запалю свічку перед кожним скринею,
І всі їх відімкни, і стану сам
Серед них дивитися на блискучі купи.
А. С. Пушкін. Скупий лицар

Сховище XML DB фактично є деревно-організованої файлової системою всередині БД, елементами якої виступають ресурси: каталоги (папки) і файли. У статті показано, як можна працювати з репозитарієм XML DB. 


Введення


XML DB, створена в рамках БД Oracle, дає можливість наступного:



Сховище XML DB, фактично є деревно-організованої файлової системою всередині БД, елементами якої виступають ресурси: Каталоги (папки) і довільні файли. Папки можна заводити і видаляти, а файли – заводити, видаляти і витягувати.


Технічно ресурси репозитарію XML DB суть документи XML. Елемент Contents кожного такого документа являє зміст ресурсу, а всі інші елементи є метаданими, що описують ресурс.


Засобами доступу до ресурсів, що становить репозитарій, можуть служити:



Тут розглядаються дві перші категорії засобів, а остання залишена для самостійних вправ.


Доступ до ресурсів засобами SQL


Дві похідні таблиці (з вихідних, у схемі XDB) дозволяють дізнатися інформацію про ресурси XML DB: PATH_VIEW і RESOURCE_VIEW:


SQL> DESCRIBE resource_view


Name          Null?    Type


———– ——– ——————————- —————-


RES                  SYS.XMLTYPE(XMLSchema


"Http://xmlns.oracle.com/xdb/XDBResource.xsd"


                     Element “Resource”)


ANY_PATH             VARCHAR2(4000)


RESID                RAW(16)


SQL> DESCRIBE path_view


Name        Null?    Type


———– ——– ——————————- —————-


PATH                 VARCHAR2(1024)


RES                  SYS.XMLTYPE(XMLSchema


"Http://xmlns.oracle.com/xdb/XDBResource.xsd"


                     Element “Resource”)


LINK                 SYS.XMLTYPE


RESID                RAW(16)


Обидві таблиці зберігають список ресурсів з шляхами доступу, однак завдяки можливості визначати зв'язки (links), подібно як у файловій системі, шляхів доступу до одного ресурсу може виявитися трохи; їх-то все і покаже таблиця PATH_VIEW, на відміну від RESOURCE_VIEW.


Приклади запитів. Список ресурсів в репозитарії:


SELECT any_path FROM resource_view;


Опис першого-ліпшого ресурсу:


SELECT res FROM resource_view WHERE ROWNUM = 1;


Для перегляду дерева ресурсів, окрім звичайних, існують спеціальні функції:


UNDER_PATH


EQUALS_PATH


PATH
DEPTH


Видати опису ресурсів, наявних у папці /sys/acls:


SELECT res


FROM resource_view


WHERE UNDER_PATH ( res, “/sys/acls” ) = 1


;


Видати відносні імена ресурсів, наявних у папці /sys/acls (В даному випадку це будуть імена файлів), і їх повні імена:


SELECT path ( 1 ), any_path


FROM resource_view


WHERE UNDER_PATH ( res, “/sys/acls”, 1 ) = 1


;


Опис ресурсу-папки /sys/acls:


SELECT res


FROM resource_view


WHERE EQUALS_PATH ( res, “/sys/acls” ) = 1


;


Повний опис ресурсу-файлу /sys/acls/all_all_acl.xml:


SELECT r.res.GETCLOBVAL ( )


FROM resource_view r


WHERE EQUALS_PATH ( res, “/sys/acls/all_all_acl.xml” ) = 1


;


З запитами останнього типу слід дотримуватися обережності, так як елемент Contents результуючого документа XML зберігає для ресурсу-файлу його вміст, а воно може виявитися дуже великим.


Зміст ресурсу-файлу /sys/acls/all_all_acl.xml з вмістом у форматі XML:


SELECT r.res.EXTRACT ( “//Contents” )


FROM resource_view r


WHERE EQUALS_PATH ( res, “/sys/acls/all_all_acl.xml” ) = 1


;


Інші типи файлів можуть зберігати опис вмісту в елементі / Resource / Contents / text або / Resource / Contents / binary.


Робота з ресурсами в програмі


Заводити, змінювати властивості і видаляти ресурси в репозитарії XML DB можна за допомогою пакету PL / SQL DBMS_XDB.


Приклади:


CONNECT scott/tiger


DECLARE retb BOOLEAN;


BEGIN


retb := DBMS_XDB.CREATEFOLDER ( “/public/myfolder” );


retb := DBMS_XDB.CREATERESOURCE (


  “/public/myfolder/file1.txt


, “First line” // CHR ( 10 ) // “Second line”


);


retb := DBMS_XDB.CREATERESOURCE (


  “/public/myfolder/file2.xml


, "<doc> <line> First line </ line> <line> Second line </ line> </ doc>"


);


END;


/


Перевірка:


SQL> SELECT r.res.EXTRACT ( “Resource/Contents” ) AS xml


  2  FROM resource_view r


  3  WHERE EQUALS_PATH ( res, “/public/myfolder/file2.xml” ) = 1;


XML


————————————————————–


<Contents Xmlns="http://xmlns.oracle.com/xdb/XDBResource.xsd">


  <doc xmlns=””>


    <line>First line</line>


    <line>Second line</line>


  </doc>


</Contents>


SQL> SELECT r.res.EXTRACT ( “Resource/Contents/text/text()” ) AS text


  2  FROM resource_view r


  3  WHERE EQUALS_PATH ( res, “/public/myfolder/file1.txt” ) = 1;


TEXT


————————————————————–


Firstline


Secondline


Зверніть увагу, що XML DB по-різному зберігає файл в залежності від його розширення (вправа: Переконайтеся, що XML DB інтерпретує вміст, в залежності саме від розширення файлу, а не вмісту). Відповідність розширень файлів типів MIME встановлюється і з'ясовується у файлі-ресурсі /xdbconfig.xml.


Створення зв'язку (link):


BEGIN


DBMS_XDB.LINK(


  “/public/myfolder/file1.txt


, “/public


, “myfolderfile1.txt


);


END;


/


Перевірка:


SQL> SELECT r.res.EXTRACT ("Resource / Contents / text / text ()") AS text


  2  FROM resource_view r


  3  WHERE EQUALS_PATH ( res, “/public/myfolderfile1.txt” ) = 1


SQL> /


TEXT


—————————————————————-


First line


Second line


SQL> SELECT


  2    p.path AS path


  3  , p.link.extract(“/LINK/ChildName/text()”) AS link


  4  FROM path_view p


  5* WHERE UNDER_PATH ( p.res, “/public” ) = 1


SQL> /


PATH                                          LINK


——————————————— —– —————-


/public/myfolder                              myfolder


/public/myfolderfile1.txt                     file1.txt


/public/myfolder/file1.txt                    file1.txt


/public/myfolder/file2.xml                    file2.xml


Зверніть увагу на два шляхи доступу в репозитарії до одного і того ж файлу (ресурсу).


Вилучення:


CALL DBMS_XDB.DELETERESOURCE ( “/public/myfolderfile1.txt” );


CALL DBMS_XDB.DELETERESOURCE ( “/public/myfolder/file1.txt” );


CALL DBMS_XDB.DELETERESOURCE ( “/public/myfolder/file2.xml” );


CALL DBMS_XDB.DELETERESOURCE ( “/public/myfolder” );


Вправа. Перевірте реакцію XML DB на спробу видалити неіснуючий файл або непорожні папку.


На відміну від похідних таблиць (view) словника-стправочніка в Oracle, похідні таблиці RESOURCE_VIEW і PATH_VIEW оновлюваність. Це дозволяє, наприклад, видалити зв'язок також і командою DELETE, або перемістити існуючий ресурс в іншу папку звичайною операцією UPDATE:


UPDATE path_view


SET шлях = новий _ шлях


WHERE equals_path (res, шлях) = 1


;


Приклад приміщення в репозитарій файлу ОС:


CONNECT / AS SYSDBA


CREATE DIRECTORY courses AS “c:crs”;


GRANT READ ON DIRECTORY courses TO scott;


CONNECT scott/tiger


DECLARE retb BOOLEAN;


BEGIN


retb :=


DBMS_XDB.CREATERESOURCE (


  “/public/OracleXML.doc”


, BFILENAME ( “COURSES”, “OracleXML.doc” )


);


END;


/


Перевірка:


SQL> SELECT res AS resource_description


  2  FROM resource_view


  3  WHERE EQUALS_PATH ( res, “/public/OracleXML.doc” ) = 1


  4  ;


RESOURCE_DESCRIPTION


————————————————– —————


<Resource Xmlns="http://xmlns.oracle.com/xdb/XDBResource.xsd">


<CreationDate> 2006-09-05T12: 47:57.547000 </ CreationDate>


<ModificationDate> 2006-09-05T12: 47:57.547000 </ ModificationDate>


  <DisplayName>OracleXML.doc</DisplayName>


  <Language>en-US</Language>


  <CharacterSet>WINDOWS-1251</CharacterSet>


  <ContentType>application/msword</ContentType>


  <RefCount>1</RefCount>


</Resource>


Технічно файли репозитарію розміщуються службових таблицях БД (документи XML) або в об'єктах LOB (файли всіх інших типів). Використання формату MIME для зберігання двійкових файлів не є самим економним.


Розмежування доступу


Сховище XML DB використовує власну схему захисту доступу, access control list (ACL), створеної в рамках моделі ACL для WebDAV. Основними поняттями ACL є:



  • Учасник безпеки (Principal). У XML DB це користувач БД, роль БД або користувач / роль довідника LDAP.

  • Привілей. Може бути атомарної (atomic; наприклад read-contents, update або dav: lock) і складовою (aggregate, що складається з інших привілеїв; наприклад all, dav: all або dav: read-acl). (Повний перелік наявних у XML DB привілеїв є в документації).

  • Access control entry (ACE). Запис про надання або заборони привілеї учаснику. Робиться в тексті ACL.

У XML DB є кілька вбудованих ACL, заданих наступними ресурсами:


/sys/acls/all_all_acl.xml


/sys/acls/all_owner_acl.xml


/sys/acls/bootstrap_acl.xml


/sys/acls/ro_all_acl.xml


ACL файлу /public/OracleXML.doc в програмі можна дізнатися так:


SELECT r.res.EXTRACT ( “Resource/ACL” ) AS text


FROM resource_view r


WHERE EQUALS_PATH ( res, “/public/OracleXML.doc” ) = 1;


Приклад заміни ACL ресурсу:


BEGIN DBMS_XDB.SETACL (


  “/public/OracleXML.doc”


, “/sys/acls/all_all_acl.xml”


);


END;


/


Створимо в БД роль і створимо в XML DB відповідний їй файл ACL:


CONNECT / AS SYSDBA


CREATE ROLE mygroup;


CONNECT xdb/xdb


DECLARE


aclxml VARCHAR2 ( 4000 ) :=



<acl description=”All privileges to MYGROUP, no to others”


     xmlns=”http://xmlns.oracle.com/xdb/acl.xsd” 


     xmlns:dav=”DAV:”


     xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”


     xsi:schemaLocation=”http://xmlns.oracle.com/xdb/acl.xsd


                         http://xmlns.oracle.com/xdb/acl.xsd”


>


  <ace>


    <principal>MYGROUP</principal>


    <grant>true</grant>


    <privilege>


      <all/>


    </privilege>


  </ace>


</acl>



;


retb BOOLEAN;


BEGIN


retb :=


DBMS_XDB.CREATERESOURCE ( “/sys/acls/all_mygroup_acl.xml“, aclxml )


;


END;


/


Захистимо файл /public/OracleXML.doc созданим ACL:


CONNECT scott/tiger


BEGIN


DBMS_XDB.SETACL (


  “/public/OracleXML.doc


, “/sys/acls/all_mygroup_acl.xml


);


END;


/


COMMIT;


Перевіримо видимість ресурсу користувачем SCOTT. Для зручності створимо спочатку файл із запитом:


SELECT any_path


FROM resource_view


WHERE UNDER_PATH ( res, “/public” ) = 1


.


SAVE publicpaths


Перевірка:


SQL> CONNECT scott/tiger


Connected.


SQL> @publicpaths


no rows selected


SQL> CONNECT / as sysdba


Connected.


SQL> GRANT mygroup TO scott;


Grant succeeded.


SQL> CONNECT scott/tiger


Connected.


SQL> @publicpaths


ANY_PATH


——————————————


/public/OracleXML.doc


При включенні користувача в групу ресурс став видний.


Тип XDBURITYPE для роботи з ресурсами


Для роботи з ресурсами репозитарію можна використовувати системний підтип XDBURITYPE абстрактного типу URITYPE. Зокрема, методи типу XDBURITYPE дозволяють витягувати з репозитарія вміст ресурсів.


Приклад визначення довжини файлу /public/OracleXML.doc :


SELECT


  DBMS_LOB.GETLENGTH (


    XDBURITYPE ( “/public/OracleXML.doc” ).GETBLOB ( )


  ) AS bytes


FROM dual


;


Результат:


     BYTES


———-


    504320


Таким же чином можна витягти великий файл (вміст, а не довжину) в змінну програми.


Одне із застосувань типу XDBURITYPE – дати можливість посилатися на дані в репозитарії XBM DB з полів звичайних таблиць. Приклад:


CREATE TABLE projects AS


  SELECT


    1 AS pid


  , XDBURITYPE ( “/public/OracleXML.doc” ) AS description


  FROM dual


;


SELECT


  DBMS_LOB.GETLENGTH ( p.description.GETBLOB ( ) ) AS bytes


FROM projects p;


Отримаємо:


     BYTES


———-


    504320


Зверніть увагу, що послатися на файл в репозитарії з БД можна і через тип HTTPURITYPE, однак у цьому випадку на засланні з'явиться ім'я комп'ютера і номер порту – ознаки, зовнішні по відношенню до вмісту БД, неконтрольовані засобами БД і, на відміну від посилань ззовні, по суті непотрібні.


Інші можливості


Будь-який ресурс репозитарію можна перевести в режим версійного доступу (version control resource, VCR). З цією метою, та з метою самого доступу, слід використовувати особливий пакет DBMS_XDB_VERSION.


Будь-який ресурс репозитарію можна забезпечити власним описом (метаданими; на додаток до «системним» метаданих), додавши в його опис XML («системне») свої елементи. Для цієї мети можна використовувати різні засоби:


–         в PL / SQL – процедури пакету DBMS_XDB: APPENDRESOURCEMETADATA, UPDATERESOURCEMETADATA, DELETERESOURCEMETADATA, PURGERESOURCEMETADATA;


– В SQL – операції INSERT, UPDATE, DELETE стосовно полю RES (похідної) таблиці RESOURCE_VIEW;


– Методом PROPPATCH протоколу WebDAV.


Подробиці є в документації по Oracle.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*