2013-11-13 3 views
0

Я оглядываюсь назад на разработку Oracle (11g) через несколько лет для проекта моей команды и нуждаюсь в помощи. Мы пытаемся внедрить POC, где любой столбец добавления/удаления будет падать и воссоздать агрессивный вид. Вид относится к таблице сопоставления для создания имен псевдонимов и выбора столбцов.View Creation с использованием запуска DDL

Мои решения:

--1. DDL триггер, который сканирует Добавить столбец, Бросьте столбец -> Идентифицирует имена столбцов -> Обновление Field_Map таблица -> Драже View -> Создает View с именами псевдонимов Field_Map таблицами

Вызов: Получена рекурсивной ошибкой запуска из-View создания внутри DDL

- 2. DDL Trigger сканирует для добавления столбца, столбца удаления столбцов -> -> Обновления Таблица полей полей -> Записывает идентифицированные имена столбцов, таблицы в таблицу Audit_DDL -> триггер DML в таблице аудита Audit_DDL -> отключает триггер DDL (чтобы избежать рекурсии) -> просмотр капель -> Создает вид с именами псевдонима таблицы Field_Map

Задача: Получена рекурсивная ошибка запуска. Я думаю, он все еще рассматривает весь поток как одну транзакцию. Разделение создания представления под триггером DML не помогло.

так, я имею в виду альтернатив:

--3. Store Trigger, Таблицы в Схеме1 и View Schema2. Я ожидаю, это может избежать рекурсии, так как теперь представление create теперь происходит на схеме2, а триггер построен на схеме1.

--4. Создайте хранимую процедуру, которая сканирует записи Audit_DDL (из # 2) для обновленных таблиц, столбцов. Создает представления и метки, проверенные на обработанные записи Audit_DDL. Почасовая работа теперь выполняет эту процедуру.

Любые предложения? Заранее спасибо за то, что помогли мне!

+0

Когда вы говорите: «Просмотр относится к таблице сопоставления для создания имен псевдонимов и выбора столбцов», вы имеете в виду, что представление было ** создано **, ссылаясь на эту таблицу сопоставления? Представление фактически не ссылается на таблицу сопоставления, не так ли? – Gerrat

+0

Это верно, Джеррат.Вид создается с помощью команды execute немедленно, которая будет ссылаться на таблицу field_map только для обеспечения правильных псевдонимов. – user2989971

ответ

1

Если вы хотите сделать DDL с триггера, это должно быть асинхронным. Самое простое решение было бы для триггера DDL отправить задание, используя пакет DBMS_JOB, который выполнил бы любой DDL, который вы хотите сделать. Эта работа не будет выполняться до тех пор, пока не будет выполнена транзакционная операция (заявка ALTER). Но он, вероятно, запустится через несколько секунд (в зависимости от количества других заданий, количества заданий и т. Д.). Если вы создадите оператор DDL, который хотите выполнить в триггере, и просто передайте его заданию или сохраните информацию, в которой задание понадобится в таблице, и передайте какой-то ключ (то есть имя объекта) и дайте задание собрать оператор DDL является детальностью реализации.

Это, как говорится, кажется очень плохой архитектурой. Если вы добавляете или удаляете столбец, это то, что должно пройти надлежащий процесс управления изменениями. Если изменение происходит через управление изменениями, должно быть достаточно легко включить изменения в представления в том же скрипте. И приложения, зависящие от представлений, должны быть протестированы как часть процесса управления изменениями. Если изменение не проходит через управление изменениями, а столбцы добавляются или удаляются из представлений волей-неволей, у вас возникают гораздо большие проблемы в бизнес-процессе, и вы, скорее всего, вызовите одно или несколько приложений в странное и замечательные способы в кажущиеся неясными моменты времени.

+0

+1 особенно для комментариев об исключительно плохой архитектуре. Теперь мне любопытно возможные типы столбцов, которые можно было бы удалить или добавить волей-нево, как это. – Gerrat

+0

Идея здесь заключается в том, чтобы не менять интерфейс просмотра вообще, чтобы нисходящий поток не получал тепла, чтобы изменить многие вещи на их конце. Я считаю, что он должен работать нормально, если есть наблюдаемое дополнение к таблицам (и это имеет место здесь), что не вызовет никаких проблем. Хотелось бы узнать, почему вы думаете, что это не так хорошо дизайн. Будут держать вас в курсе, если я вижу какие-либо серьезные препятствия (или достижения). – user2989971

+0

@ user2989971 - Если целью не является изменение интерфейса вида, тогда было бы бессмысленно удалять столбцы из представления, о чем вы говорите в своем вопросе. Если вы делаете тщательно контролируемый выпуск, в том числе DDL для изменения взглядов, как часть изменения, должно быть тривиальное количество усилий. Было бы бесполезно усложнять систему, пытаясь автоматизировать это, вы бы хотели, чтобы DDL вида в вашей системе управления версиями в любом случае. –

Смежные вопросы