Извлечь код или скрипт из объектов базы данных
Мне нужно извлечь код (скрипт) из всех моих функций, процедур, пакетов, представлений и таблиц, чтобы при переходе в производство я мог запустить скрипт для создания всех объектов.
При разработке я не брал скрипт для резервного копирования всех объектов базы данных.
Каков наилучший способ извлечь код или скрипт? Любое предложение или помощь очень заметны.
Спасибо
4 ответа
Вы используете систему контроля версий? Пожалуйста, сделай.
В противном случае вы можете использовать системную функцию dbms_metadata.get_ddl
, который возвратит клочок DDL, использованного для создания объекта. Это нужно будет сделать для каждого отдельного объекта, так что, возможно, стоит пройтись по user_objects
,
В качестве альтернативы вы можете просмотреть определения в PL/SQL Developer, щелкнув правой кнопкой мыши по объекту и используя view
Затем в правом нижнем углу вы можете просмотреть SQL, использованный для создания объекта.
Существует также "инструмент" экспорта, который не так хорошо объясняет, как его использовать, как вариант SQL Developer.
Конечно, правильный ответ - получить систему контроля версий и использовать ее.
Я не знаю о самой базе данных, но SQL Developer сделает это. Я уверен, что TOAD и другие подобные инструменты тоже будут.
В моем случае все пользовательские объекты начинаются с "XX". Вы можете использовать или изменить мой скрипт:
DECLARE
CURSOR c_tables IS
SELECT replace(object_type, ' ', '_') type,
object_name name,
owner schema,
object_type||'#'||object_name||'.sql' files
FROM all_objects
WHERE UPPER(object_name) LIKE 'XX%'
AND object_type NOT IN ('DIRECTORY');
ddl_text CLOB;
BEGIN
FOR rec_tables IN c_tables LOOP
dbms_output.put_line('OBJECT_TYPE: '||rec_tables.type||', OBJECT_NAME: '||rec_tables.name||', SCHEMA: '||rec_tables.schema||' ->'||rec_tables.files);
SELECT dbms_metadata.get_ddl(rec_tables.type, rec_tables.name, rec_tables.schema)
INTO ddl_text
FROM DUAL;
dbms_xslprocessor.clob2file(ddl_text, 'UTL_CUSTOM_DDL', rec_tables.files, nls_charset_id('WE8MSWIN1252'));
END LOOP;
END;
С уважением
Извините, но у вас есть неоптимальная практика разработки, которая не выходит за рамки одного разработчика.
Никогда не используйте возможности клиентов SQL GUI для редактирования объектов базы данных непосредственно в базе данных. (Если вы сознательно не хотите создавать искусственные проблемы.)
Вместо этого все SQL и PL/SQL DDL и DML должны быть расположены в текстовых файлах, сохраненных в системе контроля версий (VCS) (например, subversion, git, mercurial). Используйте ваш любимый редактор для редактирования файлов.
Измените базу данных, выполнив текстовые файлы, сохраненные в VCS, с помощью инструмента командной строки (в Oracle это sqlplus
). Это относится ко всем экземплярам базы данных: разработка, контроль качества, производство.
Для крупных проектов разработки рассмотрите возможность использования инструментов миграции схемы (например, Flyway, Roundhouse).
На протяжении многих лет мне удалось устранить множество проблем разработки и производства, применяя простое правило:
Если код отсутствует в VCS, он не существует.
(Удивительно, что в 2015 году многие команды разработчиков не использовали VCS.)