Главная страница
    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.035 c
9-1099727835
Wish
2004-11-06 10:57
2005.02.06
Как крутить спрайты?


1-1106075877
Eraser
2005-01-18 22:17
2005.02.06
Добавление рисунков в TRxRichEdit


14-1105724228
Aldor_
2005-01-14 20:37
2005.02.06
"Гюйгенс" прититанился.


1-1106472512
FFFFFFQE
2005-01-23 12:28
2005.02.06
Как через Form1.Components[i] получить размеры компонента


3-1104947532
Rule
2005-01-05 20:52
2005.02.06
Не могу восстановить БД Firebird 1.5 из gbk





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский