Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2012, 23:22   #1
patch
Пользователь
 
Регистрация: 11.05.2010
Сообщений: 23
По умолчанию Проблема стриггерами

Доброго времени суток господа, делаю клиент-серверную БД на делфи в качестве курсовика и возникла не то что проблема а скажем так, баг который со слов преподавателя не обязателен в исправлении, но чисто для себя считаю, что надо сделать все по человечески. В общем излагаю суть проблемы

в SQL explorer создаю генераторы и триггеры для первичных ключей в таблице... у триггеров код:

*лалала то что написано всегда Before insert лалала что-то там ноль и т.д.*
begin
new.столбец=GEN_ID(название генератора, шаг);
end
и все бы ничего, но при удалении строки из таблицы ,значения первичных ключеи не меняются н-р если были строки с ключами 1 2 3 то при удалении 3ей строки и добавлении ещё одной получается 1 2 4....и мне это не нравится (да и мало кому бы понравилось)... были мысли насчет добавления ещё одного триггера с изменением на after delete, но если сделать таковой с аналогичным кодом и с шагом -1, то при удалении из середины, генератор сменится на -1 и будет равен уже занесенному последнему значению первичного ключа и тогда уверен что вылетит ошибка и придется все исправлять....

з.ы. простите что так все развернуто, в сокращении не очень получается изложить...)
patch вне форума Ответить с цитированием
Старый 02.05.2012, 01:25   #2
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Цитата:
и мне это не нравится (да и мало кому бы понравилось)...
Да с чего так? Всем нравится и даже очень, никого не знаю обиженного, вы первый.
=master= вне форума Ответить с цитированием
Старый 02.05.2012, 01:41   #3
temaps
Форумчанин
 
Регистрация: 15.05.2011
Сообщений: 160
По умолчанию

Код:
new.столбец=GEN_ID(название генератора, шаг);
заменить на:
Код:
declare n int default 0;
select max(столбец) from таблица into n;
new.столбец=n+1;
temaps вне форума Ответить с цитированием
Старый 02.05.2012, 09:26   #4
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Цитата:
Сообщение от =master= Посмотреть сообщение
Да с чего так? Всем нравится и даже очень, никого не знаю обиженного, вы первый.
Соглашусь и даже очень (+1).
Прик вне форума Ответить с цитированием
Старый 02.05.2012, 09:35   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

temaps, фактически Ваш совет - "мимо кассы"...

ну будет у него 1 2 3
удалит он ID=2
будет 1 3 - чему будет следующий номер?!

Цитата:
Сообщение от =master=
Да с чего так? Всем нравится и даже очень, никого не знаю обиженного, вы первый.
=master=, +1
вообще-то, он не первый. такие уже встречались (если надо, я тут на форуме тему найду, была такая). Но по сути я полностью согласен. Всем нравится!
А такие сложности возникают, когда кто-то пытается к первичным ключам привязаться как, например, порядковому номеру... Запомните, первичные ключи несут одну нагрузку - обеспечить уникальность записей в таблице.
Всё остальное (нумерация и т.д.) - либо заводите ДОПОЛНИТЕЛЬНОЕ поле (и перенумеровываете при необходимости), либо вообще получаете нумерацию в запросе.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.05.2012, 15:52   #6
temaps
Форумчанин
 
Регистрация: 15.05.2011
Сообщений: 160
По умолчанию

А я понимаю ТС. Мне это тоже не нравится.
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
temaps, фактически Ваш совет - "мимо кассы"...
ну будет у него 1 2 3
удалит он ID=2
будет 1 3 - чему будет следующий номер?!
Мой ответ чётко на одну из двух озвученных проблем. Вторая решается по аналогии. Можно справится и с серединой, повесив на after delete:
Код:
declare n int default 0;
select max(столбец) from таблица into n;
if (old.столбец<=n) then
update таблица set столбец=old.столбец where столбец=n;
end if;
temaps вне форума Ответить с цитированием
Старый 02.05.2012, 16:04   #7
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

temaps Я не знаю что вы понимаете, а вот то что вы не понимаете, что ваш макс+1 это мина замедленного действия, знаю.

Даже ваш after delete все-равно не рабочий.
=master= вне форума Ответить с цитированием
Старый 02.05.2012, 16:33   #8
temaps
Форумчанин
 
Регистрация: 15.05.2011
Сообщений: 160
По умолчанию

Цитата:
Сообщение от =master= Посмотреть сообщение
temaps Я не знаю что вы понимаете, а вот то что вы не понимаете, что ваш макс+1 это мина замедленного действия, знаю.
Пожалуйста, пруф, если не сложно.
Цитата:
Сообщение от =master= Посмотреть сообщение
Даже ваш after delete все-равно не рабочий.
Ну надо понимать, я тут указываю идеи. Если сидеть разбирать, то у меня и в первом коде ошибка
new.столбец=n+1;
надо писать так: set new.столбец=n+1;
Я же не стал расписывать, что при таком удалении нужно, чтобы ещё форейн кеи везде каскадными упдейтами были и т.п. это уже на копание рассчитано.
Я же пишу тут не проверяя. А кому надо, тот идею обработает и сделает то, что нужно. Да, я не обратил внимания, когда писал, что триггер не может апдейтить ту таблицу из которой вызван, но это пример. Я просто показал, что при желании это сделать можно, а остальные почему-то просто отписались "а нафига"?
temaps вне форума Ответить с цитированием
Старый 02.05.2012, 16:41   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

temaps, не спора ради, а только истины для!
Мой Вам совет - никогда, (вы слышите - НИКОГДА) - не стоит updat'тить ключевые поля!
Это в практике прямой шаг к сложнейшим глюкам в виде повреждения целостности данных (Вы же не апдейтите те поля, которые ссылаются на данное ключевое поле), более того, это в данном случае ВООБЩЕ НЕ НУЖНО ДЕЛАТЬ! Ибо проблема у TC мнимая! Понимаете, ему НЕ НРАВИТСЯ, что ключевые поля идут не так, как ему хочется. А завтра ему не понравится, что там попадаются числа 13 или нечётные числа, или числа, которые есть в других таблицах, или ещё что-то, что ему не понравится... То же триггерочек нужно будет подправить?!!


Цитата:
Я же пишу тут не проверяя. А кому надо, тот идею обработает и сделает то, что нужно.
Так вот вам и пытаются сказать, что нужно подумать - а нужен ли тот кошмарный ужас, которые Вы предлагаете самому TC

Последний раз редактировалось Serge_Bliznykov; 02.05.2012 в 16:43.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.05.2012, 16:55   #10
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Зачем пруф? сами подумайте прутся на создание новой записи 2 запроса одновременно. Первый выхватил макс=4 и второй, первый вставил, а каков удел второму?
Вот и весь пруф.
Цитата:
остальные почему-то просто отписались "а нафига"?
Потому что никто не занимается этим, потому что "а нафига?".. ИД как правило (99,999%) это скрытая/системная информация , кому надо с ним возится? с каскадами и т.п. если никто не видит / не знает, а проблем можно отхватить по самое...
А номер по порядку зависит от многих условий, вставте в выборку order by (к примеру), и ваши номера полетят к чертовой матери, а следовательно их смысловая нагрузка стремительно приближается к полному нулю.
Если так уж надо некий номер по порядку, то делают так как Serge_Bliznykov в #5 указал.

Последний раз редактировалось =master=; 02.05.2012 в 17:08.
=master= вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37