Иван Задворьев - Язык PL/SQL
- Название:Язык PL/SQL
- Автор:
- Жанр:
- Издательство:Array SelfPub.ru
- Год:2018
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Иван Задворьев - Язык PL/SQL краткое содержание
Язык PL/SQL - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
При использовании пакета DBMS_JOB можно поставить в очередь заданий новое задание, которое будет автоматически выполнено в указанные моменты времени. Заданием в Oracle является анонимный блок PL/SQL, в котором, как правило, вызываются хранимые программы.
Распространено мнение, что среди всех встроенных пакетов DBMS_JOB – наиболее часто используемый администраторами баз данных Oracle.
Таблица 8.Программы пакета DBMS_JOB.
Программа
Описание программы
SUBMIT (процедура)
отправляет новое задание в очередь заданий
CHANGE (процедура)
изменяет параметры задания
WHAT (процедура)
изменяет описание задания
NEXT_DATE (процедура)
изменяет следующее время выполнения задания
REMOVE (процедура)
удаляет задание из очереди
RUN (процедура)
указывает немедленно выполнить задание
INTERVAL (процедура)
изменяет интервал между запусками задания
Будем рассматривать в качестве задания анонимный блок PL/SQL, запускающий процедуру p1.
CREATE TABLE job_test (insert_date DATE);
CREATE PROCEDURE p1 AS
BEGIN
INSERT INTO job_test VALUES(SYSDATE);
COMMIT;
END;
Отправим задание в очередь со следующими параметрами:
SQL> DECLARE
2 l_job_num INTEGER;
3 BEGIN
4 DBMS_JOB.submit(job =>l_job_num,
5 what=>'BEGIN p1; END;',
6 next_date=>sysdate,
7 interval=>'sysdate+10/24/60/60');
8 COMMIT;
9 DBMS_OUTPUT.PUT_LINE(l_job_num);
10 END;
11 /
23
PL/SQL procedure successfully completed.
В очередь будет помещено новое задание BEGIN p1; END; с немедленным выполнением после помещения в очередь и последующим выполнением каждые десять секунд, что задается выражением sysdate+10/24/60/60. На экран выводится уникальный номер задания, назначенный ему при постановке в очередь (23). Важно отметить, что после вызова процедуры DBMS_JOB.submit необходимо явно зафиксировать транзакцию, в противном случае задание в очередь поставлено не будет.
Посмотрим на результаты работы процедуры p1 и убедимся, что задание запускается каждые десять секунд:
SQL> SELECT TO_CHAR(insert_date,'DD.MM.YYYY HH24:MI:SS') AS insert_date
2 FROM job_test ORDER BY insert_date;
INSERT_DATE
–
25.01.2015 11:26:18
25.01.2015 11:26:28
25.01.2015 11:26:38
Данные о заданиях пользователя, которые в данный момент находятся в очереди, можно просмотреть в представлении словаря-справочника данных USER_JOBS:
SQL> SELECT job,log_user,last_sec,next_sec,broken,interval,what
2 FROM USER_JOBS;
JOB LAST_SEC NEXT_SEC BROKEN INTERVAL WHAT
– – – – – –
23 11:26:51 11:27:01 N sysdate+10/24/60/60 BEGIN p1; END;
В первом столбце отображаются номера заданий, назначаемые им при постановке в очередь. В следующих столбцах отображаются время последнего и следующего выполнения задания, интервал выполнения и анонимный блок PL/SQL для выполнения задания. Меткой BROKEN (заблокировано) помечаются те задания, при шестнадцати попытках выполнения которых произошли ошибки. Заблокированные задания перестают выполняться, поэтому администратору баз данных следует контролировать содержание представления DBA_JOBS, в котором отображаются сведения обо всех заданиях. Если в задании временно отпала необходимость, то его можно пометить как заблокированное специально, используя для этого процедуру DBMS_JOB.broken.
Удаляется из очереди задание следующим образом:
SQL> BEGIN
2 DBMS_JOB.remove(23);
3 COMMIT;
4 END;
5 /
PL/SQL procedure successfully completed.
Файловый ввод-вывод
Встроенный пакет UTL_FILE предоставляет программам PL/SQL возможность работать с файлами на сервере. С помощью этого пакета можно решать следующие задачи:
формирование на сервере небольших текстовых отчетов;
загрузка в базу данных строк небольших текстовых файлов;
чтение log-файлов сервера для мониторинга ошибок;
формирование log-файлов программ PL/SQL.
Для загрузки/выгрузки данных значительных (мегабайты, гигабайты) объемов следует использовать не пакет UTL_FILE, а использовать клиентские приложения – SQL*Loader для загрузки данных и SQL*Plus для их выгрузки. Если запускать эти утилиты на сервере баз данных, то их использование – самый быстрый способ загрузить и выгрузить данные из базы в файлы. В то же время при разработке серверной бизнес-логики встречаются ситуации, когда читать и писать в файлы хотелось бы именно в хранимых программах на PL/SQL без усложнений, вызванных обращениями к другим средствам. Чтобы для каждого поступившего платежа выгружать на сервере XML-файл размером меньше килобайта пакет UTL_FILE вполне подходит.
Настройка ограничений доступа к каталогам
Считается, что UTL_FILE потенциально может представлять большую угрозу безопасности баз данных Oracle. Этот пакет дает возможность доступа к файлам от имени такого пользователя операционной системы, который в ней имеет доступ ко всем файлам данных, журнала базы данных, управляющим файлам, файлам паролей и параметров. Получив неправомерный доступ к пакету UTL_FILE, при определенных навыках можно довольно быстро грамотно вывести базу данных из строя или реализовать угрозу нарушения конфиденциальности информации (например, прочитать файлы данных).
По этой причине перед использованием пакета UTL_FILE требуется настроить ограничения доступа к каталогам, с файлами из которых сможет осуществлять операции пакет. Настроить ограничения доступа к каталогам можно сделать двумя способами:
использовать параметр базы данных utl_file_dir;
создать специальные объекты баз данных – директории (DIRECTORY) и предоставить пользователям привилегии доступа к ним.
В параметре utl_file_dir задается список каталогов, с файлами из которых может осуществлять операции UTL_FILE. Для просмотра текущего значения параметра utl_file_dir можно использовать представление словаря данных V$PARAMETER или команду SHOW PARAMETER утилиты SQL*Plus:
SQL> SELECT value dir FROM V$PARAMETER
2 WHERE name='utl_file_dir';
DIR
–
C:\Dir1
SQL> SHOW PARAMETER utl_file_dir
NAME TYPE VALUE
– – –
utl_file_dir string C:\Dir1
Значением параметра utl_file_dir может быть и символ *, что означает, что с помощью пакета UTL_FILE можно получить доступ к файлам в любых каталогах, к которым есть доступ у пользователя oracle операционной системы сервера. Выставление этого параметра таким способом обычно практикуется в тестовых инсталляциях и должно быть совершенно исключено в production по требованиям безопасности.
Директория (directory) – объект баз данных Oracle, являющийся псевдонимом каталога в файловой системе сервера. Директории создаются DDL-командами следующего вида:
SQL> CREATE OR REPLACE DIRECTORY dir1 AS 'C:\Dir1';
Directory created.
По сравнению с использованием параметра utl_file_dir, директории дают более гибкие возможности по управлению доступом к файлам. Так, после того как директория создана, администратор базы данных может предоставить конкретным пользователям привилегии только на чтение из нее:
SQL> GRANT READ ON DIRECTORY dir1 TO user1;
Grant succeeded.
Параметр utl_file_dir задает список каталогов сразу для всех пользователей, которые имеют привилегии на выполнение программ пакета UTL_FILE, причем настроить конкретные действия (чтение или запись) с файлами из этих каталогов с его помощью нельзя.
Читать дальшеИнтервал:
Закладка: