проблема с тригером, новичок

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
ostin
Сообщения: 10
Зарегистрирован: 10 сен 2007, 19:32

проблема с тригером, новичок

Сообщение ostin » 10 сен 2007, 19:49

добрый вечер. я здесь впервые.
у меня такой вопрос создал тригер для проверки дубликатов при вводе новых записей, вот он такой получился,
тригер выдал исключение только если я вводе текст согласно регистру сущест. записи
SELECT name FROM cotrydnik WHERE name = NEW.name
INTO :kadr;
IF (kadr = new.name) THEN
EXCEPTION NEW_KADR;
я попробовал использ. upper но результат тотже
IF (upper(kadr) = upper(new.name)) THEN
EXCEPTION NEW_KADR;
в чем проблема, upper должен привести текст к верхн. регистру

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Re: проблема с тригером, новичок

Сообщение Merlin » 10 сен 2007, 20:08

ostin писал(а):добрый вечер. я здесь впервые.
у меня такой вопрос создал тригер для проверки дубликатов при вводе новых записей,
Господи, да за это уже пора канделябром... Нельзя проверять триггерами ни уникальность, ни ссылочную целостность. За исключением редких случаев. Для этого существуют констрейнты и ввод с обработкой исключений.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 10 сен 2007, 20:21

добавлю, что upper-то должен, если это не after insert триггер.
ну и смотря какая версия IB/FB. Если дремучее старье, то
www.ibase.ru/devinfo/ibrusfaq.htm

ostin
Сообщения: 10
Зарегистрирован: 10 сен 2007, 19:32

Re: проблема с тригером, новичок

Сообщение ostin » 10 сен 2007, 20:24

Merlin писал(а): Господи, да за это уже пора канделябром... Нельзя проверять триггерами ни уникальность, ни ссылочную целостность. За исключением редких случаев. Для этого существуют констрейнты и ввод с обработкой исключений.
это ты хорошо сказал ,
но если можно по подробней изъяснитесь

ostin
Сообщения: 10
Зарегистрирован: 10 сен 2007, 19:32

Сообщение ostin » 10 сен 2007, 20:36

kdv

тригер BEFORE INSERT, а версия Firebird 1.5
но все же статья по ссылки я прочту

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Re: проблема с тригером, новичок

Сообщение Merlin » 10 сен 2007, 20:51

ostin писал(а):
Merlin писал(а): Господи, да за это уже пора канделябром... Нельзя проверять триггерами ни уникальность, ни ссылочную целостность. За исключением редких случаев. Для этого существуют констрейнты и ввод с обработкой исключений.
это ты хорошо сказал ,
но если можно по подробней изъяснитесь
Иэхх... Изъясняюсь.

Пользователь Коля стартовал транзакцию и делает
Insert Into Tovary (Name) Values ('МАСЛО');
Пусть в этот момент в таблице масла нет. Триггер проверяет, всё путём.
До того, как Коля закоммитил свой инсёрт, пользователь Вася делает то же самое. Триггер проверяет, масло уже вроде есть, но видит это только транзакция, которая его туда засунула. А Васина - не, не видит. И триггер в её контексте тоже не видит. В то же самое время пользователь Маша видит в таблице слово ПРЕЗЕРВАТИВЫ. И с воплем - вот уроды, мы же работаем с продуктами питания! - выполняет
Update Tovary Set Name='МАСЛО' where Name='ПРЕЗЕРВАТИВЫ'. Триггер проверяет, Коля и Вася ещё не закоммитили своё масло, триггер в транзакции Маши ничего не видит. Все дружно коммитят, рефрешат запросы и, видя три масла, дружно говорят - Пля!

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 10 сен 2007, 22:38

тригер BEFORE INSERT, а версия Firebird 1.5
тогда аппер должен работать.

ostin
Сообщения: 10
Зарегистрирован: 10 сен 2007, 19:32

Re: проблема с тригером, новичок

Сообщение ostin » 10 сен 2007, 23:25

Merlin писал(а):Иэхх... Изъясняюсь.

Пользователь Коля стартовал транзакцию и делает
Insert Into Tovary (Name) Values ('МАСЛО');
Пусть в этот момент в таблице масла нет. Триггер проверяет, всё путём.
До того, как Коля закоммитил свой инсёрт, пользователь Вася делает то же самое. Триггер проверяет, масло уже вроде есть, но видит это только транзакция, которая его туда засунула. А Васина - не, не видит. И триггер в её контексте тоже не видит. В то же самое время пользователь Маша видит в таблице слово ПРЕЗЕРВАТИВЫ. И с воплем - вот уроды, мы же работаем с продуктами питания! - выполняет
Update Tovary Set Name='МАСЛО' where Name='ПРЕЗЕРВАТИВЫ'. Триггер проверяет, Коля и Вася ещё не закоммитили своё масло, триггер в транзакции Маши ничего не видит. Все дружно коммитят, рефрешат запросы и, видя три масла, дружно говорят - Пля!
Merlin я оценил твой опыт работы в IB/FB (я сам не давно работаю с этой бд, я таких чудных сравнений как твое, часто встречаю) ты прекрасно разбираешся в продуктах питания и презервативах, но я просил подилиться опытом работы в FB т.е. разобраться почему upper может не работать в вер 1.5 и как это можно решить эту проблему. а твои доводы о том что три lucky people могут Insert Values ('МАСЛО') сделать и как это у них получилось, это может и интересно , но меня все же сейчас интересует UPPER.

ostin
Сообщения: 10
Зарегистрирован: 10 сен 2007, 19:32

Сообщение ostin » 10 сен 2007, 23:35

kdv писал(а):
тригер BEFORE INSERT, а версия Firebird 1.5
тогда аппер должен работать.
но вот интересно, upper не работает. например. в базе есть запись "Первая" если я добавлю запись "Первая" тригер выдаст исключение, но смогу добавить запись "первая". если можеш kdv проверь такой вариант. (поле тип д. varchar, код. win1251).

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 11 сен 2007, 00:26

если можеш kdv проверь такой вариант
слушай, не парь мозг, ради бога....
я тебе дал ссылку на faq по русским буквам (1251). Если у тебя это не работает, это твоя проблема. Я за 12 лет напроверялся так, что вон статей уже тучу написал. :)

проверить очень легко -
select upper(field) from table
если столбец не в верхнем регистре, значит ты накосячил, и сделал НЕ ТАК как в ibrusfaq.htm , только и всего. Сделаешь так как там написано - будет работать. Замечу, что в 1.5 upper работает для win1251 без collate pxw_cyrl.

p.s. не жди что тебе будут отвечать по пунктам. Кроме того, я ответил на один вопрос, а Merlin на другой. Даже если upper будет работать, твой триггер будет срабатывать не во всех случаях.
Последний раз редактировалось kdv 11 сен 2007, 11:49, всего редактировалось 2 раза.

SAMZ
Сообщения: 128
Зарегистрирован: 21 мар 2005, 08:17

Re: проблема с тригером, новичок

Сообщение SAMZ » 11 сен 2007, 09:55

ostin писал(а): Merlin я оценил твой опыт работы в IB/FB (я сам не давно работаю с этой бд, я таких чудных сравнений как твое, часто встречаю) ты прекрасно разбираешся в продуктах питания и презервативах...
Опыт Мерлина ты еще не оценил, пока. Придет время, оценишь! Если получится.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Re: проблема с тригером, новичок

Сообщение Merlin » 11 сен 2007, 12:23

ostin писал(а):это может и интересно , но меня все же сейчас интересует UPPER.
Пилите, Шура, пилите! (С)

ostin
Сообщения: 10
Зарегистрирован: 10 сен 2007, 19:32

Re: проблема с тригером, новичок

Сообщение ostin » 11 сен 2007, 19:29

SAMZ писал(а):
ostin писал(а): Merlin я оценил твой опыт работы в IB/FB (я сам не давно работаю с этой бд, я таких чудных сравнений как твое, часто встречаю) ты прекрасно разбираешся в продуктах питания и презервативах...
Опыт Мерлина ты еще не оценил, пока. Придет время, оценишь! Если получится.
Я и не думал эти словами нагрубить, ты прав я не могу сейчас оценить его опыт, просто на поставленный мной вопрос (допускаю что для вас он глупый), я получил ответ по русски , что нужно учитывать работу транзакций при создании такого тригера, и не слова про мой вопрос.

ostin
Сообщения: 10
Зарегистрирован: 10 сен 2007, 19:32

Re: проблема с тригером, новичок

Сообщение ostin » 11 сен 2007, 19:42

Merlin писал(а):
ostin писал(а):это может и интересно , но меня все же сейчас интересует UPPER.
Пилите, Шура, пилите! (С)
Merlin, не серчай на меня, я думаю когда ты только начинал, у тебя тоже было много вопрос, как? почему? я принял на вооружения твое мнение о паралельной работе нескольких человек и понял что нужно и такие варианты

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Re: проблема с тригером, новичок

Сообщение Merlin » 11 сен 2007, 19:49

ostin писал(а):я получил ответ по русски , что нужно учитывать работу транзакций при создании такого тригера, и не слова про мой вопрос.
Не надо передёргивать. Ты получил ответ, что проверку на уникальность вообще нельзя делать триггером. Но если ты так уж хочешь наступить на известные грабли, то изволь. Какого лешего апперить нулл в IF? В Select-то ты ищешь на равенство без upper-ов. Вот он ничего и не находит. Кстати, какого лешего писать второй раз условие поиска в IF, если таковая запись уже найдена селектом, то есть в переменной KADR не нулл, тоже выше моего разумения.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 11 сен 2007, 19:51

Кстати, а что бум делать с однофамильцами?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 12 сен 2007, 12:44

Merlin писал(а):Кстати, а что бум делать с однофамильцами?
Мержить :)))

ostin
Сообщения: 10
Зарегистрирован: 10 сен 2007, 19:32

Сообщение ostin » 12 сен 2007, 20:03

Merlin писал(а):Кстати, а что бум делать с однофамильцами?
придумать можно че небудь ,я думаю можно например сравнить дату рождения (моно инн), вероятность занести двух таких людей в бзау, очень мала, если вобще существует

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 12 сен 2007, 20:48

ostin писал(а):
Merlin писал(а):Кстати, а что бум делать с однофамильцами?
придумать можно че небудь
О! Молодец :) Так вот, ты сначала много-много подумай, а потом уже бросайся триггера писать, а то потом уж очень обидно будет всю писанину выбрасывать и писать новую :) Короче, уникальность, дополнительную к PK, обеспечивают наличием констрейнта Unique. Именно в IB/FB это практически то же самое, что и обычный уникальный индекс, только на него в случае редкой необходимости можно ещё и сослаться с другой таблицы по FK. И при попытке ввода дубликата приложение получит execption, который оно должно обработать с целью выдачи пользователю вразумительного сообщения или изменения дальнейшей работы автомата, выполняющего инсёрт. И эти констрейнты/индексы могут быть многосегментными, то есть, обеспечивать уникальность нескольких признаков, набора, а не одного.

Ответить