Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.046 c
4-1103382597
Laxy
2004-12-18 18:09
2005.02.06
Список оборудования


14-1105705208
Ega23
2005-01-14 15:20
2005.02.06
Пятничные задачки


14-1106123612
07BB:080Dh
2005-01-19 11:33
2005.02.06
Требования по программе


4-1103014178
Delphi5.01
2004-12-14 11:49
2005.02.06
хочу сделать у этой формы тень


4-1103276198
Neznaika
2004-12-17 12:36
2005.02.06
"Живые" ярлыки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский