|
Программирование >> Oracle
1746 Приложение А Я рассмотрю ряд проблем, часто встречающихся при использовании пакета UTL FILE, в том числе: установку параметра инициализации UTL FILE DIR; доступ к дискам других компьютеров (сетевым дискам) в среде Windows (проблем с этим в среде Unix нет); обработку исключительных ситуаций, возникающих при использовании пакета UTL FILE; применение пакета UTL FILE для периодического пересоздания статических Web-страниц; печально известное ограничение - 1023 байта; получение списка файлов каталога, чтобы можно было обработать все находящиеся в нем файлы. Параметр инициализации UTL FILE DIR Это наиболее существенная особенность использования пакета UTL FILE, который всегда работает от имени пользователя - владельца СУБД Oracle, - ввод-вывод в1пол-няет выделенный или разделяемый сервер, всегда работающий от имени пользователя oracle. С учетом того, что работа с файлами выполняется от имени пользователя oracle, а пользователь oracle может читать и записывать файлы данных, файлы конфигурации и т.п., - не стоит разрешать доступ с помощью средств UTL FILE ко всем каталогам. В файле параметров инициализации необходимость явно перечислять каталоги, к которым необходим доступ на запись, - это средство защиты, а не излишняя сложность. Если бы пакет UTL FILE позволял записывать файлы в доступных пользователю oracle каталогах, то любой пользователь с помощью функции UTL FILE.FOPEN смог бы переписать файлы данных системы. Это, конечно же, недопустимо. Поэтому администратор базы данных должен явно открывать доступ к конкретным каталогам. Нельзя разрешить доступ к корневому каталогу поддерева, позволив тем самым обращаться ко всем каталогам этого поддерева, - надо явно перечислить все каталоги, в которых предполагается чтение и изменение файлов с помощью пакета UTL FILE. Следует помнить, что изменять параметр инициализации в процессе работы сервера нельзя. Для добавления или удаления каталога необходимо перезапускать экземпляр. Параметр инициализации UTL FILE DIR можно задавать одним из следующих способов: utl file dir = (c:\temp,c:\temp2) utl file dir = c:\temp utl file dir = c:\temp2 Другими словами, можно либо задавать список каталогов через запятую, в круглых скобках, либо перечислять каталоги по одному в последовательных строках. Главное здесь - в последовательных строках . Если файл параметров инициализации (init.ora) завершается следующими строками: Пакет UTL FILE 1747 utlfiledir = c:\temp timedstatistics=true utl filedir = c:\temp2 учтена будет только последняя запись - UTL FILE DIR. Первый каталог будет проигнорирован. Это может сбивать с толку, поскольку никаких предупреждающих сообщений или записей в файле alert.log, свидетельствующих об игнорировании записи UTL FILE DIR, не появляется. Все записи UTL FILE DIR в файле параметров инициализации должны идти подряд. Хочу предупредить об одной особенности использования параметра инициализации на платформе Windows. Если добавить к значению параметра UTL FILE DIR завершающую обратную косую черту (\), например, так: utl file dir = c:\temp\ utl file dir= c:\temp2 при запуске сервера будет выдано следующее сообщение об ошибке: SVRMGR> Startup LRM-00116: syntax error at c:\terrputl file following = LRM-00113: error when processing file -> C:\oracle\admin\tkyte816\pfile\init.ora ORA-01078 : failure in processing system parameters Дело в том, что символ \ является управляющим, если стоит последним в строке файла параметров инициализации. Он позволяет продолжить длинную запись на следующей строке. Чтобы избежать такой конкатенации строк, нужно просто указывать две обратных косых подряд: utl file dir= c:\temp\\ utl file dir = c:\oracle И последняя особенность этого параметра инициализации. Если в файле параметров инициализации использована завершающая обратная косая черта в имени каталога, необходимо указывать завершающую обратную косую и в вызовах функции fopen. Если обратная косая не указана в файле параметров инициализации, не нужно ее задавать и в вызовах функции fopen. Параметр функции fopen, задающий имя каталога, должен буквально совпадать с одним из значений, заданных в файле параметров инициализации. Обращение к сетевым дискам в Windows Эта задача часто вызывает затруднения, особенно у тех, кто привык работать в ОС Unix. В ОС Unix смонтированное устройство (например, смонтированный клиентом NFS удаленный диск) немедленно становится доступным всем пользователям, независимо от того, в каком сеансе оно смонтировано. У каждого пользователя могут быть свои права доступа к нему, но смонтированный диск - это атрибут системы, а не конкретного сеанса. В среде Windows все не так. На сервере может работать несколько пользовательских сеансов, каждый со своим набором доступных дисков . Может оказаться, что, зарегистрировавшись, я обнаружу сетевой ресурс - диск D:, физически находящийся на дру- 1748 Приложение А гой машине. Но это не означает, что процесс, работающий на этой машине, сможет увидеть этот диск. Вот тут и возникают проблемы. Многие пользователи регистрируются на сервере и видят диск D:. Они включают в файл параметров конфигурации запись UTL FILE dir = d:\reports - каталог, в котором предполагается создание отчетов с помощью средств пакета UTL FILE. При выполнении, однако, они получают сообщение об ошибке: ERROR at line 1: ORA-06510: PL/SQL:unhandleduser-defined exception ORA-06512: at SYS.UTL FILE , line 98 ORA-06512: at SYS.UTL FILE , line 157 С помощью обработчика исключительных ситуаций (ниже представлен код, который я обычно использую) это сообщение можно сделать более информативным, например: ERROR at line 1: ORA-20001: INVALID PATH: File location or filename was invalid. ORA-06512: at TKYTE.CSV , line 51 ORA-06512: at line 2 Итак, с точки зрения пользователя каталог D:\reports вполне допустим. Его можно найти с помощью программы Проводник (Explorer). Можно открыть окно командной строки DOS и обнаружить в нем этот каталог. Только СУБД Oracle его не видит. Причина в том, что при запуске системы диска D: нет и, более того, учетная запись, от имени которой работает сервер Oracle, по умолчанию вообще не может обращаться к сетевым ресурсам. Пытайтесь сколько угодно, монтируйте диск любым способом - сервер Oracle его не увидит. При создании экземпляра Oracle службы, поддерживающие его, настраиваются для регистрации в системе от имени учетной записи SYSTEM (как системные), а эта учетная запись имеет ограниченные привилегии, и домены Windows NT ей недоступны. Чтобы обращаться к другой машине, работающей под управлением Windows NT, служба OracleServiceXXXX должна зарегистрироваться в соответствующем домене Windows NT от имени пользователя, имеющего доступ к диску, который предполагается использовать с помощью пакета UTL FILE. Чтобы изменить стандартные параметры регистрации для служб Oracle, выберите (в ОС Windows NT): Control Panel Services OracleServiceXXXX Startup Log On As; (где XXXX - имя экземпляра) B OC Windows 2000 следует выбрать: Control Panel Administrative Tools Services OracleServiceXXXX Properties Log On Tab; (где XXXX - имя экземпляра) Выберите переключатель This Account и введите соответствующую информацию о регистрации в домене. После настройки служб для работы от имени пользователя с соответствующими привилегиями, параметр UTL FILE DIR можно задать одним из двух способов. С помощью сопоставленного диска. Чтобы использовать сопоставленный удаленному ресурсу диск, необходимо, чтобы пользователь, от имени которого запуска-
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |