Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.06;
Скачать: CL | DM;

Вниз

Count(*)   Найти похожие ветки 

 
Некто   (2005-01-04 14:56) [0]

вот простой набросок
select count(*) from table where (firm=new.firm)
в триггере before insert надо узнать число записей, соответствующих new.firm, и в соответствии с результатом выдавать сообщении о дублировании или нет......вот и проблема в том, как узнать какой результат вернул этот запрос, т.е. чё лежит в count(*)?


 
msguns ©   (2005-01-04 15:03) [1]

Зачем в триггере знать кол-во записей ? А если уж так надо, то для подсчета кол-ва строк таблицы, ИМХО, лучше юзать ХП. Хотя что-то здесь не здорОво..


 
Sergey_Masloff   (2005-01-04 15:23) [2]

Если только сообщение задай констрейнт уникальный на поле. При вставке дубля исключение лови и хошь своими словами пользователю сообщай хочешь просто Exception.Message продублируй


 
Desdechado ©   (2005-01-04 15:40) [3]

в Count(*) "лежит" число записей по условию.
для проверки дублирования достаточно IF( EXISTS( SELECT id FROM ...) ) THEN
EXCEPTION ex_DoubleRecord;


 
msguns ©   (2005-01-04 16:17) [4]

Допер, кажись.. Это он таким образом хочет получить новый ID для прайм-ключа ? Если так, то ууууууууууууууу.... Покруче гильотины будет !


 
Некто   (2005-01-04 19:01) [5]

msguns ©   (04.01.05 16:17) [4]

не для прайм-ключа!
Постановка задачи такая:

есть таблица:
/*   Справочник отделов   */
create table otdel
(
 kod_otdel smallint not null primary key,
 adress varchar(50) not null unique
);


конечно есть генератор:
create generator g_otdel;
set generator g_otdel to 1;


а вот триггер:
create trigger bi_otdel for otdel
active before insert position 0
as
begin
 if (new.kod_otdel is null) then
   new.kod_otdel=GEN_ID(g_otdel,1);;
end;


так вот, как бы мне прикрутит к этому триггеру проверку на то, есть ли уже в справочнике такое значение adress. Если есть, то заменить стандартное сообщение на своё и откатить транзакцию. Есть ещё вариант с SQLCODE -803, но куда его вставлять и прикручивать вообще не понимаю.


 
Некто   (2005-01-04 21:47) [6]

Никто мне не поможет? :-(


 
DrPass ©   (2005-01-04 23:54) [7]


> есть ли уже в справочнике такое значение adress

Добавь ограничение unique на это поле, и тогда тебе об этом намекнет соответствующее exception


 
Некто   (2005-01-05 01:09) [8]

DrPass ©   (04.01.05 23:54) [7]
/*   Справочник отделов   */
create table otdel
(
kod_otdel smallint not null primary key,
adress varchar(50) not null unique
);


или этого мало?


 
msguns ©   (2005-01-05 10:52) [9]

Достаточно.
Однако есть одно НО.
Судя по названию поля, это адрес. Который можно записать как
"ул.Ленина", так и "ул.В.И.Ленина". По сути, это один и тот же адрес, однако проверка на уникальность не "сработает" по понятным причинам. ИМХО, адрес проверять не следует. Нет и не может быть универсальной защиты от дурака.
Если же отделов много, "географический" разброс существенный, то, в конце концов, заведи дополнительный справочник зданий с адресами, а в ообъекте "Отдел" указывай ссылку на его ID


 
Некто   (2005-01-05 15:52) [10]

Тут дело даже не в "справочнике отделов", похожих по структуре справочников, в базе несколько.....если есть у кого подобный триггер с подоюной проверкой, то выложите плиз :-)


 
Desdechado ©   (2005-01-05 20:59) [11]

см. еще раз [3]
возбуждение Exception откатит транзакцию


 
Заинтересованный   (2005-01-05 22:00) [12]

т.е. не важно где сей код написан "IF( EXISTS( SELECT id FROM ...) ) THEN EXCEPTION ex_DoubleRecord;"? Если в триггере before insert возникнет исключение, то вставка не будет осуществлена?


 
Zacho ©   (2005-01-05 22:29) [13]

Desdechado ©   (05.01.05 20:59) [11]
возбуждение Exception откатит транзакцию


Не транзакцию, а только текущую операцию.

Заинтересованный   (05.01.05 22:00) [12]
Если в триггере before insert возникнет исключение, то вставка не будет осуществлена?


Да. Любое исключение при выполнении операции откатывает её. И если в after insert - то будет то же самое. И даже если триггер вызовет срабатывание другого триггера, на другой таблице, и в нём возникнет исключение - то все изменения, вызванные инициировавшем их SQL - оператором будут отменены. Ибо SQL - операторы атомарны.


 
Desdechado ©   (2005-01-06 11:16) [14]

Да, я немного некорректно высказался. Но обычно откат операции (у меня по крайней мере) внутри транзакции приводит к ее откату.



Страницы: 1 вся ветка

Текущий архив: 2005.02.06;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.024 c
1-1106307654
Separator
2005-01-21 14:40
2005.02.06
RAS


4-1103554307
Bless
2004-12-20 17:51
2005.02.06
Как работает DefWindowProc?


14-1105778834
Кудесник
2005-01-15 11:47
2005.02.06
Есть же уроды на белом свете...


1-1106386713
Sicilla
2005-01-22 12:38
2005.02.06
Кодирование темы в письме e-mail


1-1106498375
Grigoryan
2005-01-23 19:39
2005.02.06
Показывать окно с сообщением сразу после появления главного окна