![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
PL/SQL Цикл по полям.
Курдль © (2008-08-22 17:37:00)Коллеги!
Возможно ли в триггере организовать цикл по полям таблицы?
Это нужно для замысловатого журналирования написать триггера почти на все таблицы, чтобы вычислять изменившиеся поля и писать их в логи. На SQL.ru искал решения - но нашел только такие же вопросы без ответов...
Игорь Шевченко (2008-08-25 16:45:00) [21]Курдль (25.08.08 15:12) [14]
> Я уж спорил на эту тему с Ю.Зотовым и Petr V. Abramov за
> пивом.
Будет желание и возможность - можешь и со мной за пивом поспорить.
> 2. Трудно поддерживать повторяемость в проектах под разные
> СУБД.
Собственно, разрабатывать относительно большой проект под разные СУБД особо большого смысла не имеет - получится "плохой под разные СУБД" проект, слово "плохой" можно смело заменить на "неоптимальный".
Мало того, что все СУБД отличаются в механизмах работы, каждый их механизм встроен в СУБД и оптимизирован, следовательно, работает всяко быстрее (и надежнее), чем попытки его имитации на клиенте любого рода, будь то толстый клиент или сервер приложений.
Я Кайта процитирую:
"Лучшим способом, позволяющим достичь некоторого уровня мобильности приложения для множества баз данных, является кодирование всех компонентов базы данных, используемых приложением, в хранимых процедурах."
Ну и кроме всего прочего, стоимость СУБД обычно несопоставима со стоимостью большого корпоративного приложения...
Курдль (2008-08-25 15:12:00) [22]
> Игорь Шевченко © (25.08.08 14:57) [13]
> Но главная ценность в серверной логике - это то, что можно
> не гонять данные туда-сюда, обсчитывая ту самую логику.
Я уж спорил на эту тему с Ю.Зотовым и Petr V. Abramov за пивом.
И мне казалось, что привел весомые аргументы.
Гонять данные - это, конечно, не кошерно. И я против выполнения логики на клиенте. Я - за трехзвенку с мощным сервером приложений.
Вот мои аргументы.
1. В проекте накладно содержать много разнородных разработчиков.
2. Трудно поддерживать повторяемость в проектах под разные СУБД.
3. В то время, когда программирование продвинулось от процедурного к объектному, а уж не за горами и победа паттернов, - СУБД только делают неуклюжие попытки перейти к объектному программированию.
Игорь Шевченко (2008-08-25 14:57:00) [23]
> Это, на мой взгляд, единственная ценность из всей серверной
> логики.
В серверной логике немножко больше ценностей, например, view и пакеты :)
Но главная ценность в серверной логике - это то, что можно не гонять данные туда-сюда, обсчитывая ту самую логику.
Курдль (2008-08-25 14:01:00) [24]
> Petr V. Abramov © (25.08.08 11:32) [9]
> это жесть.
> так же, как и триггеры
Чем тебе триггеры-то не угодили?
Это, на мой взгляд, единственная ценность из всей серверной логики.
Курдль (2008-08-25 13:22:00) [25]
> Игорь Шевченко © (25.08.08 11:52) [10]
> И че ? Есть заказчики, которые желают знать, кто именно
> и что изменил. Их полное и неотъемлемое право
Кстати, я давно уже интересуюсь гранью, когда пора уж будет переходить на хранилища данных во всех ипостасях (в части, касающейся "историзации" данных).
Даже ветку хотел завести на тему "нормальная форма и версионность/историзация - как им ужиться?".
Игорь Шевченко (2008-08-25 11:52:00) [26]Petr V. Abramov © (25.08.08 11:32) [9]
> аудит
> > почти на все таблицы
> это жесть.
И че ? Есть заказчики, которые желают знать, кто именно и что изменил. Их полное и неотъемлемое право
Petr V. Abramov (2008-08-25 11:32:00) [27]
> Игорь Шевченко © (25.08.08 09:52) [8]
аудит
> почти на все таблицы
это жесть.
так же, как и триггеры
Игорь Шевченко (2008-08-25 09:52:00) [28]Курдль (25.08.08 09:34) [7]
> Ага! :) Жаль, нет смайлика типа из м/ф "Вовка в Тридевятом
> царстве": "А вы и есть за меня будете? - Ага!"
> Именно так и хотелось бы.
Я бы программно сгенерировал такой триггер (такие триггеры), а что - набор полей есть, логику ты знаешь, раз уж обычного AUDIT-а недостаточно
Курдль (2008-08-25 09:34:00) [29]
> А как ты себе это представляешь ?
> IF :NEW||col_name <> :OLD||col_name THEN
> log_record_change ?
> проще триггер сгенерировать программно или использовать
> Oracle Workspace Manager для ведения истории записей
Ага! :) Жаль, нет смайлика типа из м/ф "Вовка в Тридевятом царстве": "А вы и есть за меня будете? - Ага!"
Именно так и хотелось бы.
Дело в том, что я не разработчик. И не заказчик. А где-то в промежности. :(
Заказчики, как всегда, заказали немного криво, а подрядчики, как всегда, добавили кривизны. Требовать от последних при всех доработках еще и журналирование по полной схеме поддерживать - нереально (это не входило в ФТ). А включить в один change request "всеобъемлющий скрипт" - еще можно было бы договориться.
> Petr V. Abramov © (23.08.08 12:04) [6]
> на DATABASE OPTIONS DETAILS 18.09 пойдешь?
А меня туда никто не приглашал :(
Я как-то в последнее время в BI-тусовке прижился.
Petr V. Abramov (2008-08-23 12:04:00) [30]или 11g с Total Recall
http://www.oracle.com/database/total-recall.html
P.S.
> Курдль
на DATABASE OPTIONS DETAILS 18.09 пойдешь?
Petr V. Abramov (2008-08-23 11:00:00) [31]
> Это нужно для замысловатого журналирования написать триггера
> почти на все таблицы, чтобы вычислять изменившиеся поля
> и писать их в логи.
тогда лучше в сторону logminer погляди
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_logmnr.htm#i79049
Игорь Шевченко (2008-08-23 09:35:00) [32]Труп Васи Доброго © (22.08.08 21:12) [3]
То, что я предложил - это несколько нонсенс :)
Труп Васи Доброго (2008-08-22 21:12:00) [33]
> чтобы вычислять изменившиеся поля и писать их в логи.
А чем тебе сам триггер не угодил? Зачем "вычислять" изменивщиеся поля, если при каждом изменении записи вызывается триггер, вот и сравнивай в нём, как Игорь предложил
> IF :NEW||col_name <> :OLD||col_name THEN
А дальше делай что угодно.
Такое ощущение, что либо ты не понимаешь что такое триггер и как он работает, либо ты не корректно описал задачу. Поясни плиз.
Игорь Шевченко (2008-08-22 18:53:00) [34]
> Это нужно для замысловатого журналирования написать триггера
> почти на все таблицы, чтобы вычислять изменившиеся поля
> и писать их в логи.
А как ты себе это представляешь ?
IF :NEW||col_name <> :OLD||col_name THEN
log_record_change ?
проще триггер сгенерировать программно или использовать Oracle Workspace Manager для ведения истории записей
Правильный$Вася (2008-08-22 18:36:00) [35]
FOR x IN( SELECT * FROM User_Tab_Cols WHERE table_name = ...