проблема с тригером, новичок
Модератор: kdv
проблема с тригером, новичок
добрый вечер. я здесь впервые.
у меня такой вопрос создал тригер для проверки дубликатов при вводе новых записей, вот он такой получился,
тригер выдал исключение только если я вводе текст согласно регистру сущест. записи
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 должен привести текст к верхн. регистру
у меня такой вопрос создал тригер для проверки дубликатов при вводе новых записей, вот он такой получился,
тригер выдал исключение только если я вводе текст согласно регистру сущест. записи
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: проблема с тригером, новичок
Господи, да за это уже пора канделябром... Нельзя проверять триггерами ни уникальность, ни ссылочную целостность. За исключением редких случаев. Для этого существуют констрейнты и ввод с обработкой исключений.ostin писал(а):добрый вечер. я здесь впервые.
у меня такой вопрос создал тригер для проверки дубликатов при вводе новых записей,
добавлю, что upper-то должен, если это не after insert триггер.
ну и смотря какая версия IB/FB. Если дремучее старье, то
www.ibase.ru/devinfo/ibrusfaq.htm
ну и смотря какая версия IB/FB. Если дремучее старье, то
www.ibase.ru/devinfo/ibrusfaq.htm
Re: проблема с тригером, новичок
это ты хорошо сказал ,Merlin писал(а): Господи, да за это уже пора канделябром... Нельзя проверять триггерами ни уникальность, ни ссылочную целостность. За исключением редких случаев. Для этого существуют констрейнты и ввод с обработкой исключений.
но если можно по подробней изъяснитесь
Re: проблема с тригером, новичок
Иэхх... Изъясняюсь.ostin писал(а):это ты хорошо сказал ,Merlin писал(а): Господи, да за это уже пора канделябром... Нельзя проверять триггерами ни уникальность, ни ссылочную целостность. За исключением редких случаев. Для этого существуют констрейнты и ввод с обработкой исключений.
но если можно по подробней изъяснитесь
Пользователь Коля стартовал транзакцию и делает
Insert Into Tovary (Name) Values ('МАСЛО');
Пусть в этот момент в таблице масла нет. Триггер проверяет, всё путём.
До того, как Коля закоммитил свой инсёрт, пользователь Вася делает то же самое. Триггер проверяет, масло уже вроде есть, но видит это только транзакция, которая его туда засунула. А Васина - не, не видит. И триггер в её контексте тоже не видит. В то же самое время пользователь Маша видит в таблице слово ПРЕЗЕРВАТИВЫ. И с воплем - вот уроды, мы же работаем с продуктами питания! - выполняет
Update Tovary Set Name='МАСЛО' where Name='ПРЕЗЕРВАТИВЫ'. Триггер проверяет, Коля и Вася ещё не закоммитили своё масло, триггер в транзакции Маши ничего не видит. Все дружно коммитят, рефрешат запросы и, видя три масла, дружно говорят - Пля!
Re: проблема с тригером, новичок
Merlin я оценил твой опыт работы в IB/FB (я сам не давно работаю с этой бд, я таких чудных сравнений как твое, часто встречаю) ты прекрасно разбираешся в продуктах питания и презервативах, но я просил подилиться опытом работы в FB т.е. разобраться почему upper может не работать в вер 1.5 и как это можно решить эту проблему. а твои доводы о том что три lucky people могут Insert Values ('МАСЛО') сделать и как это у них получилось, это может и интересно , но меня все же сейчас интересует UPPER.Merlin писал(а):Иэхх... Изъясняюсь.
Пользователь Коля стартовал транзакцию и делает
Insert Into Tovary (Name) Values ('МАСЛО');
Пусть в этот момент в таблице масла нет. Триггер проверяет, всё путём.
До того, как Коля закоммитил свой инсёрт, пользователь Вася делает то же самое. Триггер проверяет, масло уже вроде есть, но видит это только транзакция, которая его туда засунула. А Васина - не, не видит. И триггер в её контексте тоже не видит. В то же самое время пользователь Маша видит в таблице слово ПРЕЗЕРВАТИВЫ. И с воплем - вот уроды, мы же работаем с продуктами питания! - выполняет
Update Tovary Set Name='МАСЛО' where Name='ПРЕЗЕРВАТИВЫ'. Триггер проверяет, Коля и Вася ещё не закоммитили своё масло, триггер в транзакции Маши ничего не видит. Все дружно коммитят, рефрешат запросы и, видя три масла, дружно говорят - Пля!
но вот интересно, upper не работает. например. в базе есть запись "Первая" если я добавлю запись "Первая" тригер выдаст исключение, но смогу добавить запись "первая". если можеш kdv проверь такой вариант. (поле тип д. varchar, код. win1251).kdv писал(а):тогда аппер должен работать.тригер BEFORE INSERT, а версия Firebird 1.5
слушай, не парь мозг, ради бога....если можеш 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 раза.
Re: проблема с тригером, новичок
Опыт Мерлина ты еще не оценил, пока. Придет время, оценишь! Если получится.ostin писал(а): Merlin я оценил твой опыт работы в IB/FB (я сам не давно работаю с этой бд, я таких чудных сравнений как твое, часто встречаю) ты прекрасно разбираешся в продуктах питания и презервативах...
Re: проблема с тригером, новичок
Пилите, Шура, пилите! (С)ostin писал(а):это может и интересно , но меня все же сейчас интересует UPPER.
Re: проблема с тригером, новичок
Я и не думал эти словами нагрубить, ты прав я не могу сейчас оценить его опыт, просто на поставленный мной вопрос (допускаю что для вас он глупый), я получил ответ по русски , что нужно учитывать работу транзакций при создании такого тригера, и не слова про мой вопрос.SAMZ писал(а):Опыт Мерлина ты еще не оценил, пока. Придет время, оценишь! Если получится.ostin писал(а): Merlin я оценил твой опыт работы в IB/FB (я сам не давно работаю с этой бд, я таких чудных сравнений как твое, часто встречаю) ты прекрасно разбираешся в продуктах питания и презервативах...
Re: проблема с тригером, новичок
Merlin, не серчай на меня, я думаю когда ты только начинал, у тебя тоже было много вопрос, как? почему? я принял на вооружения твое мнение о паралельной работе нескольких человек и понял что нужно и такие вариантыMerlin писал(а):Пилите, Шура, пилите! (С)ostin писал(а):это может и интересно , но меня все же сейчас интересует UPPER.
Re: проблема с тригером, новичок
Не надо передёргивать. Ты получил ответ, что проверку на уникальность вообще нельзя делать триггером. Но если ты так уж хочешь наступить на известные грабли, то изволь. Какого лешего апперить нулл в IF? В Select-то ты ищешь на равенство без upper-ов. Вот он ничего и не находит. Кстати, какого лешего писать второй раз условие поиска в IF, если таковая запись уже найдена селектом, то есть в переменной KADR не нулл, тоже выше моего разумения.ostin писал(а):я получил ответ по русски , что нужно учитывать работу транзакций при создании такого тригера, и не слова про мой вопрос.
О! Молодецostin писал(а):придумать можно че небудьMerlin писал(а):Кстати, а что бум делать с однофамильцами?

