Форум: "Базы";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.035 c