Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с триггером-счетчиком, плиз?! 
V
    Опции темы
Kbl4AH
Дата 24.9.2008, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: нет
Всего: 15



Позарез нужно сделать такую штучку в Oracle 9, но не знаю как(((
В таблицах есть поле ID. Как сделать, чтобы при вставке строк в таблицу или изменении существующих, значение поля ID вставлялось автоматом, причем, чтобы это было значение, которого нет в таблице.
Например, 1 строка - ID 1, 2 строка - ID 2, 3 строка - ID 3... Потом вторую строку удалили, вставили новую строку и у нее ID 2...
Подскажите, пожалуйста. Желательно, чтоб это можно было сделать в PL/SQL Developer.
PM MAIL ICQ   Вверх
DimW
Дата 24.9.2008, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



а можно для начала узнать конечную цель. что сподвигло вас на это?
PM MAIL ICQ   Вверх
Nuzur
Дата 24.9.2008, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: нет
Всего: 5



Kbl4AH, Вообще то если не учитывать 
Цитата

Потом вторую строку удалили, вставили новую строку и у нее ID 2...

То это самый стандартный триггер на вставку из последовательности нового значения... Я конечно могу Вам такой триггер написать какой Вы просите со всеми замечаниями ( дело то плевое ) но вот проблема в том что ЭТО либо будет грузить сервер БД( перебор существующих значений ) либо ЭТО будет чревато дополнительной таблицей записей которые были удалены.
ИМХО бредятина и то и другое + может привести к неприятным сюрпризам если констрейты "забыть" поднять, короче не советую, да и логика УНИКАЛЬНОСТИ ключевого поля в таком случаи как бы теряется... 

Это сообщение отредактировал(а) Nuzur - 24.9.2008, 17:14


--------------------
Never again...
PM MAIL   Вверх
DimW
Дата 24.9.2008, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Цитата(Nuzur @  24.9.2008,  17:09 Найти цитируемый пост)
Я конечно могу Вам такой триггер написать( дело то плевое )

сомниваюсь я что называя данный механизм "плевым" вы задумались о мутации и о том что несколько пользователей одноврименно редактируют таблицу. 
Nuzur, продемонстрируйте приз, а то мож я от жизни отстал...

Это сообщение отредактировал(а) DimW - 24.9.2008, 17:21
PM MAIL ICQ   Вверх
Zloxa
Дата 24.9.2008, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



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


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Nuzur
Дата 24.9.2008, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: нет
Всего: 5



DimW, Я имел в виду как пример для однопользовательского режима конечно smile
Если речь идет об отдельной таблицы то SELECT FOR UPDATE никто не отменял... и там после завизировать как использованный.

ЗЫ в любом случаи идея граблевая и изменить я это не могу.

Zloxa, Спасибо. Но я и сам знаю что вопрос обоснован smile Просто неясно зачем ЭТО человеку нужно. Поэтому "пытаем" его, а вдруг правда промелькнет...


--------------------
Never again...
PM MAIL   Вверх
Kbl4AH
Дата 24.9.2008, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: нет
Всего: 15



Я, наверное, неправильно выразился...
Мне нужно, чтобы при вставке новой записи или апдейте существующей (апдейт поля ID), значение присваивалось автоматом. Причем это значение должно удовлетворять требованиям: не должно совпадать с уже существующими ID и должно быть не рамдомным, а следующим по списку и минимальным из возможных (если некоторые ID вследствие удаления строк пропущены)...
То есть: 1-е ID - 1, следующее - 2, следующее - 3. Строка с ID 1 - удалена, тогда следующее ID - 1, следующее - 4.
Это можно сделать так: создать счетчик (sequence) на +1 (начиная с 1), а потом создать триггер на инсерт/апдейт (причем ID не повторяются). Мне друг показывал как-то давно, но я сейчас не могу вспомнить...
Нужно мне это для следующего - в проге используются разные справочники, причем поле ID скрыто от пользователя (оно ему не нужно, он оперирует с содержимым). Есть еще таблицы, которые пользователь инсертит/апдейтит (в таблицах значения некоторых полей - ID из справочников, но видит он не ID, а соответствующее им содержимое). То есть пользователю нужны справочники, но он не оперирует с ID. А при редактировании справочника эти ID должны вставляться автоматом.
В Oracle это реализовать легче, чем в Delphi. На словах - использовать в триггере счетчик... Если так - сложно, то нужен хотя бы триггер, который будет автоматом присваивать следующее по порядку значение полю ID (например, вставил строку - ID 1, вставил 2-ю строку - ID 2, вставил 3-ю строку - ID 3; без учета удаленных значенипй ID)
PM MAIL ICQ   Вверх
DimW
Дата 25.9.2008, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Цитата(Kbl4AH @  24.9.2008,  19:26 Найти цитируемый пост)
Я, наверное, неправильно выразился...

да нет же все именно так вас и поняли, поэтому у всех возник один и тот же вопрос, ЗАЧЕМ???

по поводу уникальности поля:
Код

create sequence for_table_test
/
create table test
(
  id   number not null,
  name varchar2(100)
)
/
alter table test
  add constraint test_id_pk primary key (id)
/
create or replace trigger test_bi
before insert
on test
for each row
begin
  select for_table_test.nextval
    into :new.id
   from dual;  
end;
/
insert into test (name) values ('xxx')
/
insert into test (name) values ('zzz')
/
insert into test (name) values ('yyy')
/
select * from test
/


все остальное неимеет смысла даже обсуждать.
PM MAIL ICQ   Вверх
Zloxa
Дата 25.9.2008, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(Kbl4AH @  24.9.2008,  15:56 Найти цитируемый пост)
Например, 1 строка - ID 1, 2 строка - ID 2, 3 строка - ID 3... Потом вторую строку удалили, вставили новую строку и у нее ID 2...


Цитата(Kbl4AH @  24.9.2008,  19:26 Найти цитируемый пост)
1-е ID - 1, следующее - 2, следующее - 3. Строка с ID 1 - удалена, тогда следующее ID - 1, следующее - 4.

Это же уже совсем другой кампот:
Код

SQL> create table tst (id number primary key, val number);
 
Table created
SQL> create sequence tst$seq;
 
Sequence created
SQL> create trigger tst$bi  before insert on tst for each row
  2  begin
  3    select Tst$seq.nextval into :new.id from dual;
  4  end;
  5  /
 
Trigger created
SQL> insert into tst (val) select dbms_random.value from all_objects where rownum <=3;
 
3 rows inserted
SQL> select * from tst;
 
        ID        VAL
---------- ----------
         1 0.26718483
         2 0.87768983
         3 0.17452977
SQL> delete from tst where id = 1;
 
1 row deleted
SQL> insert into tst (val) values (null);
 
1 row inserted
SQL> select * from tst;
 
        ID        VAL
---------- ----------
         2 0.87768983
         3 0.17452977
         4 
 
SQL> 



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Kbl4AH
Дата 25.9.2008, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: нет
Всего: 15



Спасибо.
PM MAIL ICQ   Вверх
LSD
Дата 25.9.2008, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Цитата(DimW @  24.9.2008,  18:21 Найти цитируемый пост)
сомниваюсь я что называя данный механизм "плевым" вы задумались о мутации и о том что несколько пользователей одноврименно редактируют таблицу. 

Блокировка на таблицу и "пусть весь мир подождет" smile


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Zloxa
Дата 25.9.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(LSD @  25.9.2008,  11:55 Найти цитируемый пост)
Блокировка на таблицу и "пусть весь мир подождет" smile 

Угу, а мутацию обходить стейтмент триггером + pl/sql table и "пусть все импорты отвалятся"


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Petro123
Дата 25.9.2008, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



Цитата

 и о том что несколько пользователей одноврименно редактируют таблицу. 

А что разве нельзя id сделать unique или я чего то не догоняю...
А что такое мутация?

Добавлено через 6 минут и 35 секунд
А это наверно типа:
 - пользователь A хочет добавить
 - пользователь B уже добавил но свою транзакцию не зафиксировал, 
 - пользователь A не видит добавленное пользователем B
PM MAIL   Вверх
Zloxa
Дата 25.9.2008, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(Petro123 @  25.9.2008,  15:26 Найти цитируемый пост)
А что такое мутация?

Trigger Restrictions on Mutating Tables 

Цитата(Petro123 @  25.9.2008,  15:26 Найти цитируемый пост)
А это наверно типа

Нет, эта "типа" называется "изоляция тразнакций" smile 

Это сообщение отредактировал(а) Zloxa - 25.9.2008, 15:56


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Petro123
Дата 25.9.2008, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



Цитата

А что такое мутация?

Ясно, а можно в двух словах....
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.1614 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.