|
Программирование >> Oracle
Глава 8 tkyte@TKYTE816> create table t2 (coll int references tl, col2 int check (col2>0)); Table created. tkyte@TKYTE816> create index t2 idx on t2(col2,coll); Index created. tkyte@TKYTE816> create trigger t2 trigger before insert or update of coll, col2 on t2 for each row 2 begin 3 if (:new.coll < :new.col2) then 4 raise application error(-2 0001, 5 Invalid Operation Coll cannot be less then Col2) ; 6 end if; 7 end; 8 / Trigger created. tkyte@TKYTE816> create view v 2 as 3 select tl.y tl y, t2.col2 t2 col2 from tl, t2 where tl.x = t2.coll 4 / View created. To можно затем запустить ЕХР и IMP: C:\>exp userid=tkyte/tkyte owner=tkyte C:\>imp userid=tkyte/tkyte full=y indexfile=tkyte.sql В файле tkyte.sql будет: REM CREATE TABLE TKYTE . Tl ( X NUMBER(*,0), Y NUMBER(*,0)) PCTFREE REM 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 LOGGING STORAGE(INITIAL 524288) REM TABLESPACE DATA ; REM ... 0 rows REM ALTER TABLE TKYTE . Tl ADD PRIMARY KEY ( X ) USING INDEX PCTFREE 10 REM INITRANS 2 MAXTRANS 255 STORAGE (INITIAL 524288) TABLESPACE DATA REM ENABLE ; REM CREATE TABLE TKYTE . T2 ( COL1 NUMBER(*,0), COL2 NUMBER(*,0)) REM PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 LOGGING STORAGE (INITIAL REM 524288) TABLESPACE DATA ; REM ... 0 rows CONNECT TKYTE; CREATE INDEX TKYTE . T2 IDX ON T2 ( COL2 , COL1 ) PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 524288) TABLESPACE DATA LOGGING ; REM ALTER TABLE TKYTE . T2 ADD CHECK (col2>0) ENABLE ; REM ALTER TABLE TKYTE . T2 ADD FOREIGN KEY ( COL1 ) REFERENCES Tl REM ( X ) ENABLE ; Удалив операторы REM, получим операторы ЯОД для создания объектов, занимающих место на диске, но не для триггера или представления (не будет также процедур, пакетов и т.д.). Утилита ЕХР экспортирует эти объекты, но утилита IMP их не показывает при задании параметра INDEXFILE. Один из способов заставить утилиту IMP показать их - задать параметр SHOW: Импорт и экспорт 417 C:\ImpExp> imp userid=tkyte/tkyte show=y full=y Import: Release 8.1.6.0.0 - Production on Mon Apr 23 15:48:43 2001 (c) Copyright 1999 Oracle Corporation. All rights reserved. Connected to: Oracle8i Enterprise Edition Release 8.1.6.0.0 - Production With the Partitioning option JServer Release 8.1.6.0.0 - Production Export file created by EXPORT:V08.01.06 via conventional path import done in WE8ISO8859P1 character set and WE8ISO8859P1 NCHAR character set . importing TKYTEs objects into TKYTE CREATE TABLE Tl ( X NUMBER(*,0), Y NUMBER(*,0)) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 LOGGING STORAGE (INITIAL 524288) TABLESPACE DATA . . skipping table Tl CREATE TABLE T2 ( COL1 NUMBER(*,0), COL2 NUMBER(*,0)) PCTFREE 10 PCTU SED 40 INITRANS 1 MAXTRANS 255 LOGGING STORAGE(INITIAL 524288) TABLESPACE DATA . . skipping table T2 CREATE INDEX T2 IDX ON T2 ( COL2 , COL1 ) PCTFREE 10 INITRANS 2 MAX TRANS 255 STORAGE (INITIAL 524288) TABLESPACE DATA LOGGING CREATE FORCE VIEW TKYTE . V ( T1 Y , T2 COL2 ) AS select tl.y tl y, t2.col2 t2 col2 from tl, t2 where tl.x = t2.coll CREATE TRIGGER TKYTE .t2 trigger before insert or update of coll, col2 on t2 for each row begin if (:new.coll < :new.col2) then raise application error(-20001,Invalid Operation Coll cannot be le ss then Col2); end if; end; ALTER TRIGGER T2 TRIGGER ENABLE Import terminated successfully without warnings. Обратите внимание: результат абсолютно не подходит для обычного использования. Например, рассмотрим фрагмент: CREATE TABLE T2 ( COL1 NUMBER(*,0), COL2 NUMBER(*,0)) PCTFREE 10 PCTU SED 40 INITRANS 1 MAXTRANS 255 LOGGING STORAGE(INITIAL 524288) TABLESPACE Утилита IMP разрывает строки в произвольных местах - слово PCTUSED разбито на части. Кроме того, каждая строка начинается и завершается двойной кавычкой. Удаление этих кавычек еще не сделает файл сценария применимым, поскольку команды разбиты на строки в произвольных местах. Более того, сам исходный код также поврежден : if ( :new.coll < :new.col2 ) then raise application error(-2 0 0 01,Invalid Operation Coll cannot be le ss then Col2); end if; 418 Глава 8 Утилита IMP вставила символ перевода строки прямо в середину строки кода, в строковый литерал. Наконец, сами команды никак не разделены: CREATE INDEX T2 IDX ON T2 ( COL2 , COL1 ) PCTFREE 10 INITRANS 2 MAX TRANS 255 STORAGE (INITIAL 524288) TABLESPACE DATA LOGGING CREATE FORCE VIEW TKYTE . V ( T1 Y , T2 COL2 ) AS select tl.y tl y, t2.col2 t2 col2 from tl, t2 where tl.x = t2.coll CREATE TRIGGER TKYTE .t2 trigger before insert or update of coll, col2 on t2 for each row Команда CREATE INDEX плавно переходит в CREATE VIEW, а та, в свою очередь, - в CREATE TRIGGER и так далее (надеюсь, вы поняли!). Чтобы использовать этот файл, его надо тщательно редактировать. Но, мы получили недостающее: хотя формат и не подходит для непосредственного выполнения, все можно восстановить. Такой файл может пригодиться в том случае, если вы случайно удалили весь созданный за последний месяц код и хотите его восстановить. Вот почему я регулярно экспортирую свою базу данных дважды в неделю и применяю к результатам IMP...SHOW = Y (как было показано в разделе Экспортирование больших объемов данных ). Неоднократно мне удавалось восстановить для клиентов достаточно актуальную копию кода по результатам выполнения этой команды. Это избавляло от необходимости восстанавливать для получения кода всю базу данных на определенный момент времени. (Это был еще один альтернативный вариант: данные в базе никогда не теряются!) Преодоление ограничений с помощью сценариев Если мне необходимо перенести из одной схемы в другую код PL/SQL, я предпочитаю использовать сценарии. У меня есть сценарий для получения исходных текстов пакета, процедуры или функции. Другой сценарий предназначен для извлечения представлений. Еще один позволяет получить исходный текст триггера. Перенос таких объектов - не лучший способ использования утилит EXP/IMP. Переносите с помощью ЕХР/ IMP таблицу - и все будет отлично. Попробуйте с помощью EXP/IMP извлечь несколько определений таких объектов, и все станет менее радужным. Поскольку эти сценарии весьма полезны, я представил их здесь, в главе, посвященной ЕХР. Возможно, читая этот раздел, вы пытались найти способ получения исходного кода с помощью утилиты IMP. Теперь вы знаете, что IMP не позволяет получить его в удобочитаемом виде. Итак, вот сценарий, извлекающий исходный код любого пакета (в том числе тела пакета), функции или процедуры и записывающий его в одноименный файл SQL. Если выполнить команду SQL> @getcode myprocedure, этот сценарий создаст файл myprocedure.sql, содержащий соответствующую подпрограмму PL/SQL: REM getcode.sql - выбирает любую процедуру, функцию или пакет set feedback off set heading off set termout off set linesize 1000
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |