![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]Зачем в триггерезнать кол-во записей ? А если уж так надо, то для подсчета кол-ва строк таблицы, ИМХО, лучше юзать ХП. Хотя что-то здесь не здорОво..