Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Count(*) [D7, IB6.x]


Некто ©   (2005-01-04 14:56:00) 

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


Desdechado   (2005-01-06 11:16:00) [1]

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


Zacho   (2005-01-05 22:29:00) [2]

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


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

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


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


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

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


Desdechado   (2005-01-05 20:59:00) [4]

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


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

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


msguns   (2005-01-05 10:52:00) [6]

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


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

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


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


DrPass   (2005-01-04 23:54:00) [8]


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

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


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

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


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

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, но куда его вставлять и прикручивать вообще не понимаю.


msguns   (2005-01-04 16:17:00) [11]

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


Desdechado   (2005-01-04 15:40:00) [12]

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


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

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


msguns   (2005-01-04 15:03:00) [14]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо