|
|
|
Как вычислять поля?
|
|||
|---|---|---|---|
|
#18+
Firebird 1.5 Имеется таблица: CREATE TABLE PEOPLE ( ID_P INTEGER NOT NULL, ID_EXTP INTEGER, ... CATEGORY VARCHAR(30), N_PRIV INTEGER, ... ); Поле ID_P - заполняется генератором, поле ID_EXTP - номер очереди, поле CATEGORY - вид льготы, поле N_PRIV - номер льготной очереди. Необходимо: 1) При вставке новой записи, поле ID_EXTP необходимо увеличивать на 1, при удалении записи пересчитывать порядок нумерации поля (например если есть 100 записей и удалена 45-я пересчитать значение поля ID_EXTP от 1 до 99). 2) При вставке новой записи и НАЛИЧИИ записи в поле CATEGORY, поле N_PRIV изменять также как и поле ID_EXTP (при вставке увеличивать на 1, при удалении пересчитывать). Теперь вопросы: 1. Как лучше сделать, использовать триггеры на INSERT,DELETE или использовать процедуры? 2. Вычислять значения полей в клиентском приложении? 3. Как лучше вычислять максимальное значение полей ID_EXTP,N_PRIV (Select max(ID_EXTP) from people, а потом прибавлять 1 ???), а при работе 2 пользователей какие могут быть проблемы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2004, 11:24:14 |
|
||
|
Как вычислять поля?
|
|||
|---|---|---|---|
|
#18+
автор1. Как лучше сделать, использовать триггеры на INSERT,DELETE или использовать процедуры? Я бы процедурой сделал наверрное, т.к. в триггерах надо будет делать защиту от зацикливания ещё. автор2. Вычислять значения полей в клиентском приложении? Думаю не стоит автор3. Как лучше вычислять максимальное значение полей ID_EXTP,N_PRIV (Select max(ID_EXTP) from people, а потом прибавлять 1 ???), а при работе 2 пользователей какие могут быть проблемы? В том то и дело что проблемы могут быть - поэтому в IB есть генераторы. А так тебе прийдётся блокировать всю таблицу и мириться с dedlock-ами всякими чтобы если вставляется запись, то другим фиг. По идее это лучше всего делать через специальную процедуру или представление в короткой транзакции. Почитай это ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2004, 12:45:39 |
|
||
|
Как вычислять поля?
|
|||
|---|---|---|---|
|
#18+
Статью почитал. Да, склоняюсь больше к использованию процедур. FIB компоненты у меня есть, буду в короткой транзакции записывать данные, благо в FIB-ах к этому есть все возможности. Вот только получение максимального номера (Select max(ID_EXTP) from people) меня смущает. И еще вопрос по вычислению полей, вернее по алгоритму их обновления при удалении записи(записей), если запись удалена, каким образом лучше пересчитывать поля? При удалении, по ключевому полю посчитать сколько осталось записей и заново перенумеровать их? Или пересчитывать только те записи которые находятся после удаляемой? Если пересчитывать заново то на большом наборе данных будет медленно, пересчитывать записи после удаляемой - тогда как быть если удалены несколько записей не подряд, а в разных местах таблицы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2004, 23:26:28 |
|
||
|
Как вычислять поля?
|
|||
|---|---|---|---|
|
#18+
BigallS Необходимо: 1) При вставке новой записи, поле ID_EXTP необходимо увеличивать на 1, при удалении записи пересчитывать порядок нумерации поля (например если есть 100 записей и удалена 45-я пересчитать значение поля ID_EXTP от 1 до 99). 2) При вставке новой записи и НАЛИЧИИ записи в поле CATEGORY, поле N_PRIV изменять также как и поле ID_EXTP (при вставке увеличивать на 1, при удалении пересчитывать). ИМХО для многопользовательского режима задача не имеет решения. Удачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2004, 10:13:05 |
|
||
|
|

start [/forum/topic.php?fid=40&fpage=466&tid=1578437]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
62ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 341ms |

| 0 / 0 |
