Страница 1 из 1

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

Добавлено: 10 сен 2007, 19:49
ostin
добрый вечер. я здесь впервые.
у меня такой вопрос создал тригер для проверки дубликатов при вводе новых записей, вот он такой получился,
тригер выдал исключение только если я вводе текст согласно регистру сущест. записи
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 должен привести текст к верхн. регистру

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

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

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

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

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

Добавлено: 10 сен 2007, 20:36
ostin
kdv

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

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

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

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

Добавлено: 10 сен 2007, 22:38
kdv
тригер BEFORE INSERT, а версия Firebird 1.5
тогда аппер должен работать.

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

Добавлено: 10 сен 2007, 23:25
ostin
Merlin писал(а):Иэхх... Изъясняюсь.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 11 сен 2007, 19:51
Merlin
Кстати, а что бум делать с однофамильцами?

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

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

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