Страница 9 из 9 Проверка достоверности XML схемы В процессе загрузки XML или после обновления контента в XMLTypes, базирующихся на XML Schema, Oracle XML DB просто проверяет, правильно расширяется XML документ с проверками объектов, вместо выполнения проверки достоверности всей XML Schema. Другими словами, Oracle XML DB выполняет только ограниченные проверки для того, чтобы удостовериться, что XML документ согласуется с объектно-реляционным хранением. Например, XML DB проверит, существал ли элемент <PHONE> до вставки записей о клиентах. Это не остановит вставку данных, если номера телефонов нарушают шаблон строки, определенный в XML схеме. Для очистки от неправильных данных, которые могут быть вставлены в XMLTypes, необходимо явно запрашивать проверку достоверности XML Schema. Простейший способ это сделать - до выполнения операций INSERT создать TRIGGER, как показано ниже: CREATE OR REPLACE TRIGGER customer_insert AFTER INSERT ON customer FOR EACH ROW DECLARE doc XMLType; BEGIN doc := :new.SYS_NC_ROWINFO$; XMLType.schemaValidate(doc); END;
Если только триггер задействован, проводится полная проверка достоверности всякий раз, когда вставляются данные в таблицу customer: INSERT INTO customer VALUES( XMLType('<CUSTOMER xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://localhost:8080/public/ contact_simple_ann.xsd"> <NAME>Steve Joes</NAME> <EMAIL>
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
</EMAIL> <ADDRESS>Someroad, Somecity, Redwood Shores, CA 94065, U.S.A</ADDRESS> <PHONE>6505723456</PHONE> <DESCRIPTION>Very Important US Customer</DESCRIPTION> </CUSTOMER>')); Таким образом, этот пример вернет следующие ошибки: INSERT INTO customer * ERROR at line 1: ORA-31154: invalid XML document ORA-19202: Error occurred in XML processing LSX-00333: literal "6505723456" is not valid with respect to the pattern ORA-06512: at "SYS.XMLTYPE", line 333 ORA-06512: at "DEMO.CUSTOMER_INSERT", line 5 ORA-04088: error during execution of trigger 'DEMO.CUSTOMER_INSERT'
Как можно видеть, сообщение об ошибке утверждает, что номер телефона не следует шаблону строки, определенному в XML схеме. После того, как вы обновили номер телефона, можно попробовать снова: SQL> INSERT INTO customer VALUES( XMLType('<Customer xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://localhost:8080/public/ contact_simple_ann.xsd"> <NAME>Steve Joes</NAME> <EMAIL>
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
</EMAIL> <ADDRESS>Someroad, Somecity, Redwood Shores, CA 94065, U.S.A </ADDRESS> <PHONE>(650)572-3456</PHONE> <DESCRIPTION>Very Important US Customer</DESCRIPTION> </CUSTOMER>'));
Добавлена новая правильная запись о клиенте. Следует проверить статус проверки достоверности XML Schema äëÿ объекта XMLType, используя функцию XMLType.isSchemaValid() или функцию XMLType.isSchemaValidated(): SQL> SELECT x.isSchemaValid() FROM customer x; X.ISSCHEMAVALID() ----------------- 1 0 ...0
Предыдущий результат показывает, что есть только одна запись в таблице и она правильная по XML схеме. Записи, вставленные до этого, не имели статуса valid (правильная). Это так потому, что функция XMLType.schemaValidate() проверяет на достоверность объект XMLType и обновляет статус достоверности объектов XMLType в XML DB. ЗАМЕЧАНИЕ Включив полную проверку достоверности получим значительный негативный эффект при выполнении INSERT, таким образом, это следует использовать только в случае необходимости. Обычно лучше проводить проверку достоверности во время создания документа или на среднем уровне(middle tier). |