|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
На правах задачки, предложенной Stax: можно ли реализовать constraint по колонке вручную из триггера. Вроде можно. Я использовал вспомогательную таблицу для симуляции dirty reads, и SCN для фильтра uncommited изменений. Пример только для insert, update обрабатывается аналогично. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2020, 21:14 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
жесть какая-то. смешались в кучу кони, scn и ... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2020, 21:32 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Заставь дурака богу молиться.... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2020, 21:51 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Трава в "Маями" зачетная. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2020, 21:54 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL можно ли реализовать constraint по колонке вручную из триггера. Вроде можно. Я использовал вспомогательную таблицу для симуляции dirty reads, и SCN для фильтра uncommited изменений. Пример только для insert, update обрабатывается аналогично. Ты-бы тестировал свои ваяния: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Код: plsql 1. 2.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2020, 21:56 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
SY, Торопился с последним изменением, допустил ошибку. Замените на гугол, SCN точно меньше гугола. Я попробовал с трёх разных сессий, надёжно пресекает попытки создать дупликаты до исполнения любого из коммитов. О... Или это слишком строгое условие уникальности? Тогда ещё проще. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 04:32 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Красава, че Только вот наличие в целевой табличке надо проверять тоже уже после получения блокировки А также обязательно не забыть выполнять всю эту возню и при UPDATE и при DELETE (проверил ты что запись существует, а она уже удалена, просто не закомичена, обычный ключ бы ждал завершения этой транзакции) Ну и использование явного номера блокировки -- не есть хорошо, Oracle может сам захотеть использовать этот номер. Чтоб его зарегистрировать за определенным именем необходимо выполнить DBMS_LOCK.ALLOCATE_UNIQUE. но это также вызывает COMMIT -- это тоже надо учитывать Про производительность вообще молчу ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 08:05 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров Красава, че ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 10:00 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров Oracle может сам захотеть использовать этот номер. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 10:06 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Elic Вячеслав Любомудров Красава, че То, что не хочет читать доку -- это не совсем так, ссылки-то он на доку дает То, что он пытается перенести аналогии с какого-нибудь 86 ассемблера -- ну оно может и не правильно, но ненаказуемо А вот то, что чел реально изучает новые вещи (тот же DBMS_LOCK) хотя бы просто для того чтоб натянуть нос его пнувшим -- уже достойно уважения ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 10:16 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Elic Вячеслав Любомудров Oracle может сам захотеть использовать этот номер. Вызов DBMS_LOCK.ALLOCATE_UNIQUE будет проверять зарегистрирован ли этот lock_id для какого-нибудь имени (из таблички sys.dbms_lock_allocated), и если нет вполне может его прихватизировать ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 10:20 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров Почему бы и нет? Код: plsql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 10:30 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров А вот то, что чел реально изучает новые вещи (тот же DBMS_LOCK) хотя бы просто для того чтоб натянуть нос его пнувшим -- уже дос В психиатрии таких изолируют и не дискутируют, чтобы не ухудшить их самочувствие. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 10:37 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Elic Вячеслав Любомудров Почему бы и нет? Код: plsql 1. 2.
Код: plaintext 1.
Но у него еще хуже: 1001234567 Насколько понимаю, это вполне может пересечься с обычными (DML) блокировками, что вообще плохо ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 10:46 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Elic Вячеслав Любомудров А вот то, что чел реально изучает новые вещи (тот же DBMS_LOCK) хотя бы просто для того чтоб натянуть нос его пнувшим -- уже дос В психиатрии таких изолируют и не дискутируют, чтобы не ухудшить их самочувствие. Не верю, что ты так никогда не делал Просто вменяемые люди это в продакшн не пускают, но как тренировка -- вполне себе помогает в изучении нового Дык вроде неофит и не говорит, что это надо пускать в продакшн -- просто говорит, что неплохо бы ширше смотреть на вещи, тем более, которые уже много раз поменялись с новыми версиями ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 10:51 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров Elic пропущено... Совать что ни попадя куда не попадя чревато несчастными случаями. В психиатрии таких изолируют и не дискутируют, чтобы не ухудшить их самочувствие. Не верю, что ты так никогда не делал Просто вменяемые люди это в продакшн не пускают, но как тренировка -- вполне себе помогает в изучении нового Дык вроде неофит и не говорит, что это надо пускать в продакшн -- просто говорит, что неплохо бы ширше смотреть на вещи, тем более, которые уже много раз поменялись с новыми версиями Вячеслав, в целом согласен, но он к сожалению еще и новичкам советует... А вот это уже ни в какие ворота не лезет. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 11:07 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Согласен Но, например, ответ в Разбиение одного запроса с JOIN на несколько волне себе адекватный (точнее, что пришло на вход, то и получайте на выходе) С отсылкой к RTFM, прошу заметить ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 11:10 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров Насколько понимаю, это вполне может пересечься с обычными (DML) блокировками ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 11:56 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров Согласен Но, например, ответ в ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 11:57 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL На правах задачки, предложенной Stax: без блокирования ресурса (а так можно вообще лок табле) ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 12:03 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров "А что будет если?" Не верю, что ты так никогда не делал У пациента же, в основном, поток сознания. Ещё раз: не стоит тратить время, чтобы с ним спорить. Это типичная цель троллей - сожрать уйму чужого в пустую потраченного времени. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 12:08 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров натянуть нос его пнувшим ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 12:11 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Дык я вроде и не спорю Но запинывать под шконку молодого и (возможно) перспективного чела, который хоть и хочет все попробовать, но, кстати, весьма адекватно реагирует на критику, это же тоже неправильный подход А как еще молодым изучать Oracle Database? Понятное дело -- в первую очередь курс по Концепциям и далее в зависимости от направления -- Administration или Development Потом, как мне кажется, для обоих очень желательно прочтение двутомника Кайта (пусть он и устарел) Далее просто знать где искать ответы в документации Это я так вижу (у меня это насущная тема, собираюсь увольняться, а замены так за 20 лет и не нарисовалось, вот и пытаюсь сформулировать требования к претендентам) Ну дык у неофита все еще впереди, а что огрызается, так мы тоже не ангелы ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 12:22 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Elic Вячеслав Любомудров натянуть нос его пнувшим И просто не ставит так жестко вопрос: или-или Или ты настоящий ораклист или заткнись и сопи в тряпочку ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 12:24 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров перспективного чела ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 12:38 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Но ведь так можно сразу посылать любого? Мне дети говорят -- я бы может и устроился на такую работу, но староперды реально гнобят за незнание чего-то там И я вместе с ними негодую Хотя реально такой же староперд и с такими же претензиями Я к тому, что нужно и критиковать, но и обсуждать решения, а не сразу их отметать ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 13:03 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров Но ведь так можно сразу посылать любого? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 13:23 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров но и обсуждать решения Зачем обсуждать решения человека который не желает учиться и вместо того чтобы сначала изучить, понять и осознать, лепит ахинею и вываливает ее на форум? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 13:23 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров Я к тому, что нужно и критиковать, но и обсуждать решения, а не сразу их отметать ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 13:25 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров но староперды реально гнобят за незнание чего-то там P.S. Никогда не обращали внимание на "военную" терминологию и риторику бизнеса? Это, конечно плохо: командир своей жизнью отвечает за жизнь подчинённых, а у бизнеса такой ответственности - нет. Но, по факту, бизнес это война и не очень понятно, почему надо обхаживать какого-нибудь цатилетнего лба, который ведёт себя как дошколёнок. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 13:29 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Elic Вячеслав Любомудров Но ведь так можно сразу посылать любого? В его плесканиях я вижу адекватную реакцию на критику и таки чтение (и, отправление к) доке Это уже дорогого стоит Да блин, я точно также буду гнобить за кривую идею, построенную на неправильных предпосылках Или не буду Кстати, тот же Саян, как мне кажется, именно через наш форум, решил куда ему дальше расти и этот форум был очень неплохим учебником/общением, и его тут тоже за глупости неплохо ругали И много их таких... И, возможно, скоро именно неофит будет отвечать в команде дядюшки Тома ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 13:51 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров Кстати, тот же Саян, Лично я никого толкового никогда не гнобил, только направлял. Надеюсь (и не безпочвенно), это имело определённый успех. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 14:04 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Дык я тоже на такое надеюсь К сожалению, не все оценили ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 14:10 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Виталий, я ведь тоже начинаю ругаться, когда приходят неофиты и начинают шатать основы Более того, ругаюсь, когда они не просто свои фантазии реализуют, а начинают отвечать, типо это правильно Но ведь от них никуда не деться, кто-то же должен (прийти и подхватить знамя) продолжать работать Очень обидно, когда это знамя подхватывают просто неучи Еще обидней, когда они в силу возраста/тупизны проталкивают вот эти свои совершенно глупые (но, кажущиеся им самыми умными) идеи Как по мне -- этот топик как раз доведение до абсурда, но это задание на соображулесть -- и автор вполне его прошел -- так что 5- по моей скромной оценке ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 14:23 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL Замените на гугол, SCN точно меньше гугола. Ну заменил: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54.
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Доку по традиции не читаем (что видит и что не видит autonomous transaction). SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 14:34 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров так что 5- по моей скромной оценке ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 14:47 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров начинаю ругаться, когда приходят неофиты и начинают шатать основы хз. мне именно этим и интересны посты неофита с неконвенциональными подходами. уж точно интереснее и полезнее тысяч комментариев формата "ну тупоооой", которых даже в этом треде полно. я вообще не понимаю, что такое "расшатать основы". я либо в состоянии на пальцах и с примерами объяснить, почему что-то делать не надо, либо, если я не в состоянии, то это всегда повод спросить себя - а так ли я прав? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 14:58 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
кит северных морей, Неофит отказывается изучать и понимать многопользовательский доступ к одному ресурсу, ему почему то кажется, что если он напишет много бредового кода, то законы природы перестанут действовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 15:08 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
кит северных морей уж точно интереснее и полезнее тысяч комментариев формата "ну тупоооой" ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 15:09 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Elic Так в чём польза то? понятие "основы" за это время трансформировалось неоднократно. например, когда-то давно одной из "основ" для меня было мнение, что ссылочная целостность данных должна обеспечиваться декларативными ограничениями, и никак иначе. потом я ляпнул это на каком-то интервью, а мне в ответ сказали, что у них в системе вообще ни одного FK нет. разрыв шаблона, основа пошатнулась, и со временем сдвинулась в более правильном направлении. соответственно такие, кажущиеся неконвенциальными мнения - это всегда reality check. точно ли мнение неконвенциальное, или может просто это ты сам дурак? и польза как раз в том, что дураком время от времени оказываешься ты сам. наверное, когда вам сначала системно кладут знания в голову в правильном порядке, а потом вы начинаете их применять - это не так критично. но это, как я сказал, не мой случай. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2020, 15:56 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
SY, это мой баг. Поспешил-людей насмешил. Переделал сборку мусора во вспомогательной таблице, не заметил ошибки в случае, когда таблица пустая. Правку с гуголом писал перед сном, снова не проверил :) Там нужен не Inf, не гугол а ноль. Я думаю вы и сами давно заметили и разобрались. Извините, что потратил ваше время, надеюсь, copy/paste много не отнял. Если есть желание, проставьте 0 в nvl, или просто сделайте первый коммит чтобы сделать таблицу непустой, потом все должно работать штатно: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
С нулем, первый коммит не нужен: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2020, 01:04 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров Красава, че Спасибо :) > Только вот наличие в целевой табличке надо проверять тоже уже после получения блокировки Действительно. Я строил constraint только для вставки, как proof of concept. Мне было интересно посмотреть, с какими сложностями может столкнуться программист при создании constraint по колонке, и возможно ли это вообще. > А также обязательно не забыть выполнять всю эту возню и при UPDATE и при DELETE Конечно, это было оговорено. > Ну и использование явного номера блокировки -- не есть хорошо proof of concept >Про производительность вообще молчу proof of concept Я поначалу рассматривал возможность использования структур в памяти (collections or bitmask), но пока не разобрался можно ли их создавать в глобальном контексте. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2020, 01:12 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
graycode кит северных морей, Неофит отказывается изучать и понимать многопользовательский доступ к одному ресурсу, ему почему то кажется, что если он напишет много бредового кода, то законы природы перестанут действовать. Короткий метод через индекс вспоогательной таблицы не понравился другим, пришлось делать вручную. Давайте прекратим обсуждение ТС, и посмотрим на суть вопроса: возможно ли средствами Оракла реализовать unique constraint на таблице через триггеры? Я столкнулся с несколькими проблемами, но решил задачу для insert. Похожим образом она решается для delete, update. Мне видится, что задача решаема. Для уникальности естественно это упражнение не слишком полезно, т.к. есть встроенные средства. Для какого-нибудь экзотического constraint по колонке (напр., расстояние Левенштайна между любых двух строк не может быть менее N) мой метод позволяет построить прототип. Код опубликован, известные ошибки исправлены. Меньше страницы, можно прочитать и найти ошибку. Попробуйте, серыйкод, обмануть мой триггер как это сделал SY для ранней версии. А потом подумайте, почему мой интерес в возможности или невозможности задачи вам причиняет неудобство. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2020, 01:29 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL Для какого-нибудь экзотического constraint по колонке (напр., расстояние Левенштайна между любых двух строк не может быть менее N) мой метод позволяет построить прототип. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2020, 07:35 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL SY, Там нужен не Inf, не гугол а ноль. Там просто не нужен NVL. Ну а теперь попробуй TRUNCATE TEST23: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Но суть не в этом а в том что ты убиваешь транзакционность. При уникальном ключе сессия 2 нарвавшаяся на еще незакоммиченный дубль сессии 1 висит до тех пор пока сессия 1 не выполнит либо commit - тогда сессия 2 получит ORA-00001, либо rollback - тогда insert/update сессии 2 прекрасно завершится. Ты-же бежишь впереди паровоза и выставляешь сессии 2 ORA-00001 когда сессия 1 еще не завершила транзакцию: Cессия 1: Код: plsql 1. 2. 3. 4. 5.
Cессия 2: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2020, 15:01 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL Для какого-нибудь экзотического constraint по колонке Любые попытки извернуться через триггер заранее обречены на провал. Подумай про более чем одного пользователя и про то когда срабатывает триггер - при окончании транзакции или немного раньше. Всё кроме полной сериализаци нерабочее, а сериализация - бессмысленна. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2020, 15:56 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL, Код: plsql 1. 2. 3.
Во время выполнения этого запроса, другая сессия выполняет фиксацию транзакции, например ты проверяешь uq = 100500 и другая сессия в этот момент зафиксировала вставку с таким же uq, как ты думаешь, что произойдет дальше? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2020, 17:41 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Конструктивные ответы. Я подумаю ещё. Кабанчег, "обречены на провал" у вас означает невыполнимо в принципе, или "нет смысла, потому что встроенные лучше?" Про второе я не сомневаюсь. Про первое я пока не уверен, хочу разобраться. SY: про trunc понял,я начал с реализации только insert, другие операции пока не разрешены. Если невозможно сделать insert, то невозможно вообще. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2020, 17:58 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
graycode НеофитSQL, Код: plsql 1. 2. 3.
Во время выполнения этого запроса, другая сессия выполняет фиксацию транзакции, например ты проверяешь uq = 100500 и другая сессия в этот момент зафиксировала вставку с таким же uq, как ты думаешь, что произойдет дальше? Я думаю что вернёт 0 (зафиксировала это post?), дальше увидит значение во вспомогательной таблице и даст ошибку дупликата. Кто-то уже посоветовал перенести эту проверку в критическую секцию. Как окончательно проснусь,обновлю код триггера, чтоб не обсуждать ошибки старых версий. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2020, 18:03 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL SY: про trunc понял,я начал с реализации только insert, другие операции пока не разрешены. Если невозможно сделать insert, то невозможно вообще. Забудь про truncate. Реши транзакционность. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2020, 18:06 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL "обречены на провал" у вас означает Но стоит уточнить что именно пытаешься сымитировать. Цель недопустить двух одинаковых ключей в таблице или сэмулировать поведение с уникальным индексом, то есть 1. При наличии закомиченой записи* - exception 2. При наличии незакомиченной записи* - висим на блокировке до тех пор пока 2.1 commit - получаем exception 2.2 rollback - отлипаем 2.3 ключ изменен или удалён - отлипаем 3. При полном отсутствии записи* идём дальше ? * - понимается [с тем же ключом] Как было сказано, если полностью убить конкурентный доступ сериализацией то возможно удасться гарантировать уникальность, но смысла в этом чуть менее чем никакого. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2020, 19:35 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
SY: я перестарался с выявлением дупликатов во время post, емулируя dirty reads. Без этого код должен стать проще. Кобанчег, Я слышал сериализацию упоминалась много раз. Сериализация большой транзакции несомненно замедляет систему, но в некоторых случаях сериализованный доступ неизбежен. В этих ситуациях имеет смысл говорить об уменьшении кода в критической секции (или другом механизме синхронизации доступа). Даже сиквенс имеет сериализованный код, это не значет что сиквенсы плохие или медленные. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2020, 22:28 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Кобанчег Цель недопустить двух одинаковых ключей в таблице или сэмулировать поведение с уникальным индексом Цель - второе. Была высказана гипотеза что это невозможно, но доказать невозможность с моим уровнем знаний довольно трудно, поэтому я работаю над контрпримером, заодно обучаясь тонкостям многосессионности. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2020, 22:32 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
С улучшенным пониманием как работаet встроенный constraint уникальности (спасибо, Кабанчег, за серый текст!) предпринимаю новую попытку реализовать subj максимально приближенный по поведению к pk_key. Оговорки: пока работает только для операции insert. Полагается на строковый лок через update. Может содержать ошибки. Я протестировал из двух разных сессий commits и rollbacks. Вроде работает. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2020, 02:14 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL С улучшенным пониманием как работаet встроенный constraint уникальности (спасибо, Кабанчег, за серый текст!) Ну о том, что надо сначала читать, потом переваривать и думать и только потом выкладывать свой бред на потеху публике высказалось уже множество людей. НеофитSQL Может содержать ошибки. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2020, 07:08 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Кобанчег, У меня почему-то работало. Для "before" триггера таблица не должна мутировать. Завтра разберусь. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2020, 08:29 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL, применение dbms_lock по сути не отличается от Вашего исходного варианта с unique constraint на дополнительной таблице, поскольку примитивом синхронизации остается PK на доп. таблице: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2020, 14:13 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
andrey_anonymous, Я не использую DBMS lock в последнем варианте кода. > применение dbms_lock по сути не отличается от Вашего исходного варианта с unique constraint на дополнительной таблице, поскольку примитивом синхронизации остается PK на доп. таблице: Такое можно было бы сказать, если бы я использовал DBMS_LOCK на каждую строчку, но до такого я не додумался :) Использование одного уникального объекта схемы не приравнивается к использованию свойств PK. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2020, 18:41 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Кобанчег НеофитSQL С улучшенным пониманием как работаet встроенный constraint уникальности (спасибо, Кабанчег, за серый текст!) Ну о том, что надо сначала читать, потом переваривать и думать и только потом выкладывать свой бред на потеху публике высказалось уже множество людей. НеофитSQL Может содержать ошибки. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
Да, я вижу то же самое у себя. Тесты делал с "insert into test32 values(n)", ошибок не было. Различие в поведении между двумя способами доступа мне непонятно - Оракл особо обрабатывает однострочный insert? Решение известно, например compound trigger. На время, сужаю применимость моего решения для одиночных insert. (про delete, update, truncate было сказано в начале). Можно ли считать мое решение неотличимым от PK в поведении для одиночных insert? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2020, 18:57 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL Да, я вижу то же самое у себя. Тесты делал с "insert into test32 values(n)", ошибок не было. Различие в поведении между двумя способами доступа мне непонятно - Оракл особо обрабатывает однострочный insert? INSERT/UPDATE/DELETE - атомарная операция независимо от числа вставляемых/изменяемых/удаляемых строк. Mutating - это когда состояние таблицы когда уже не до INSERT/UPDATE/DELETE но еще не после. А вот INSERT VALUES это тот единственный случай когда ORACLE точно знает - вставка одной строки и посему BEFORE EACH ROW это точно до INSERT. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2020, 19:52 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Уточню. При условии BEFORE INSERT statement триггер таблицу не модифицировал - иначе и INSERT VALUES выдаст мутацию. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2020, 20:17 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
SY НеофитSQL Да, я вижу то же самое у себя. Тесты делал с "insert into test32 values(n)", ошибок не было. Различие в поведении между двумя способами доступа мне непонятно - Оракл особо обрабатывает однострочный insert? INSERT/UPDATE/DELETE - атомарная операция независимо от числа вставляемых/изменяемых/удаляемых строк. Mutating - это когда состояние таблицы когда уже не до INSERT/UPDATE/DELETE но еще не после. А вот INSERT VALUES это тот единственный случай когда ORACLE точно знает - вставка одной строки и посему BEFORE EACH ROW это точно до INSERT. SY. В случае "insert .. select 0 from dual" оракл тоже точно знает что одна строка, но не использует это знание. Получается, Оракл особым образом обрабатывает insert..values() не так, как вставку таблицы из одной строки. Я такой технической детали не знал. Если такое поведение задокументировано, я теперь могу написать триггер который позволит вставлять строчки только через values(), и никаким другим способом. Но вряд ли пригодится :) Интересно почему для values() Оракл не использовал общий код мультистрочной вставки. Сомневаюсь что для оптимизации скорости, однострочные вставки заведомо не помогают производительности. Возможно, внутри у Оракла есть системный триггер которому удобно читать из модифицируемой таблицы, и оракл сделал специальную обработку insert..values() чтобы помочь себе. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2020, 20:26 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
SY Уточню. При условии BEFORE INSERT statement триггер таблицу не модифицировал - иначе и INSERT VALUES выдаст мутацию. SY. Мне это уточнение непонятно. Мой "before insert by row" триггер вылетал на строке которая только читала из таблицы триггера. Вот максимально упрощенный пример: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2020, 20:36 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Переделал свое решение чтобы позволить мультистрочные вставки. Проверил из двух разных сессий, сессии помечены #1/#2. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2020, 21:01 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
С мультистрочными insert пока не тестировал. Просматриваю свой код на предмет race conditions (когда commit/rollback произойдет в другой сессии во время исполнения триггера, и сразу несколько ожидающих сессий разблокируются). Проверю с двумя-тремя ожидающими сессиями, потом запощу код. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2020, 21:26 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL На время, сужаю применимость моего решения для одиночных insert. 1. Может случится, что две параллельные сессии проверят что в test_u нет строк и каждая вставит по одной. 2. Нет никаких гарантий что вторая сессия (в которой инсерт запустили после первой) не захватит блокировку в test_u первой. итд Градус абсурда зашкаливает, я уже пожалел что влез в эту тему. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2020, 21:40 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Кобанчег НеофитSQL На время, сужаю применимость моего решения для одиночных insert. 1. Может случится, что две параллельные сессии проверят что в test_u нет строк и каждая вставит по одной. 2. Нет никаких гарантий что вторая сессия (в которой инсерт запустили после первой) не захватит блокировку в test_u первой. итд Градус абсурда зашкаливает, я уже пожалел что влез в эту тему. 1. не влияет на логику. test_u позволительно содержать дубликаты. 2. одинаково относится к PK, там нет гарантий очередности насколько мне известно. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2020, 22:02 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL SY Уточню. При условии BEFORE INSERT statement триггер таблицу не модифицировал - иначе и INSERT VALUES выдаст мутацию. SY. Мне это уточнение непонятно. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 00:44 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
SY, Спасибо за иллюстрацию! В этом коде триггер пишет в таблицу, это выглядит невероятно взрывоопасно. Я так понял глобальная переменная помогает избежать бесконечной рекурсии триггера, но неужели кто-то такое пишет? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 02:32 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL С мультистрочными insert пока не тестировал. Просматриваю свой код на предмет race conditions (когда commit/rollback произойдет в другой сессии во время исполнения триггера, и сразу несколько ожидающих сессий разблокируются). Проверю с двумя-тремя ожидающими сессиями, потом запощу код. с учетом многосессионности, и возможности что много сессий зависли на уникальном значении и их нужно правильно разблокировать поодиночке, кода получается не так уж мало. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67.
Пришлось в дополнение к вспомогательной таблице test_u, которая используется для row-level locks, завести GTT test_t, в которой находятся posted, not committed строчки из каждой сессии. Тело триггера стало напоминать псевдокод: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 02:44 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL Пришлось Но и это не помогло реализовать unique Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 09:48 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Реализация уникальности через триггер - идея заведомо обречённая на провал, т.к. есть операции при которых триггер не будет задействован. Можно сделать, что вы и продемонстрировали, кучу кода для вырожденного случая, но не более того. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 09:53 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL SY, Спасибо за иллюстрацию! В этом коде триггер пишет в таблицу, это выглядит невероятно взрывоопасно. Я так понял глобальная переменная помогает избежать бесконечной рекурсии триггера, но неужели кто-то такое пишет? За всю Одессу я не скажу. Мой пример просто иллюстрация что в принципе таки можно. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 13:36 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
env Реализация уникальности через триггер - идея заведомо обречённая на провал, т.к. есть операции при которых триггер не будет задействован. Можно сделать, что вы и продемонстрировали, кучу кода для вырожденного случая, но не более того. Я не сомневаюсь что самодельная реализация будет проигрывать встроенной, тут иллюзий нет. Мой constraint не покажется в списке constraints, его можно отключить деактивацией триггера, со вспомогательными таблицами можно проводить манипуляции, и т.д. Цель была - понять есть ли в языке достаточно возможностей для реализации несложных constraints по колонке. Уникальность была выбрана, потому что это наипростейший из встроенных, и его поведение хорошо описано. В данный момент я разбираюсь, в какой очередности select... for update отпускает сессии которые на нем застряли, и есть ли способ узнать попал ли select.. for update на лок, или успешно отработал. Мне не нравится моя конструкция с "nowait/retry", из-за возможных race conditions, а сериализировать эту часть кода нельзя. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 14:06 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Из моих экспериментов, Оракл соблюдает очередность для select.. for update, и мой row-locking код значительно упростился. Чтобы не утомлять публику частыми апдейтами, дам триггеру еще помариноваться. Вопрос по теме: как в Оракле можно эффективно реализовать constraint двуникальности? Чтобы в одной колонке находилось не более двух одинаковых значений? Эффективно - значит без table lock или строгой сериализации доступа к таблице. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 14:15 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL Цель была - понять есть ли в языке достаточно возможностей для реализации несложных constraints по колонке. Есть, инкапсулируешь логику работы с сущностью в пакете и не даешь прямого доступа к таблице. Триггеры, как ты уже убедился, не самый лучший способ реализации бизнес логики. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 14:40 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL Эффективно - значит без table lock или строгой сериализации доступа к таблице. Материализованное представление с первичным ключем и check constraint в режиме refresh fast on commit. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 14:43 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
graycode НеофитSQL Цель была - понять есть ли в языке достаточно возможностей для реализации несложных constraints по колонке. Есть, инкапсулируешь логику работы с сущностью в пакете и не даешь прямого доступа к таблице. Триггеры, как ты уже убедился, не самый лучший способ реализации бизнес логики. Извините, это общие слова. PL/SQL он одинаковый, что в триггере что в функции. Например, я реализую constraint двуникальности. Допустим я готов сделать таблицу недоступной, тем самым поломав парадигму SQL. Я умею написать пакет с функциями, но я не умею: - запретить прямой доступ не требуя переключения контекста - легко "инкапсулировать логику двуникальности" в пакете без сериализации доступа ко всей таблице Constraint по колонке - это непростая в целом задача для многопользовательского режима. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 14:55 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
andrey_anonymous НеофитSQL Эффективно - значит без table lock или строгой сериализации доступа к таблице. Материализованное представление с первичным ключем и check constraint в режиме refresh fast on commit. Первичный ключ не даст мне вставить второе значение, или я чего-то не понял. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 14:56 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
andrey_anonymous Материализованное представление с первичным ключем и check constraint в режиме refresh fast on commit. А зачем с первичным ключем? Ну и следует упомянуть это будет имитация отложенного ключа. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 15:14 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
SY А зачем с первичным ключем? Ну и следует упомянуть это будет имитация отложенного ключа. Для упрощения жизни - mat.view все-таки. ...deferred - да. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 15:20 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
andrey_anonymous Для упрощения жизни - mat.view все-таки. A что GROUP BY может выдать дубли? SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 15:26 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL, А кто тебе сказал, что реальная бизнес логика должна решаться исключительно парадигмой SQL, и что такое парадигма SQL? Если массовые вставки не планируются и вторых значений не много, то можно инкапсулировать вставку в триггере на вьюхе или процедуре, добавить поле номер двууникального значения и сделать уникальный ключ, вставка в процедуре/триггере off вьюхи идет с номером 1, если ошибка по уникальности то повторяем вставку с номером 2, если все равно ошибка по уникальности, то прокидываем ее наверх. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 15:34 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
graycode НеофитSQL, А кто тебе сказал, что реальная бизнес логика должна решаться исключительно парадигмой SQL, и что такое парадигма SQL? Если массовые вставки не планируются и вторых значений не много, то можно инкапсулировать вставку в триггере на вьюхе или процедуре, добавить поле номер двууникального значения и сделать уникальный ключ, вставка в процедуре/триггере off вьюхи идет с номером 1, если ошибка по уникальности то повторяем вставку с номером 2, если все равно ошибка по уникальности, то прокидываем ее наверх. > что такое парадигма SQL? Я имел в виду, когда к данным применимы табличные операции. Если я правильно понял ваше решение, оно полагается на составной PK из двух колонок - одно для значения, второе для счетчика (1-2). ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 16:15 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL Я имел в виду, когда к данным применимы табличные операции. К представлениям применимы табличные операции. НеофитSQL Если я правильно понял ваше решение, оно полагается на составной PK из двух колонок - одно для значения, второе для счетчика (1-2). Да. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 16:22 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
graycode НеофитSQL Я имел в виду, когда к данным применимы табличные операции. К представлениям применимы табличные операции. Хорошо. Я спрятал таблицу, но чтобы к ней можно было писАть через SQL, сделал представление. Теперь мне снова нужен триггер, только теперь на вьюхе, чтобы мой "особый" constraint исполнить. Так что ли? И как мне "прятать" исходную таблицу, чтобы руками не лезли, а только через представление? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 16:35 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL Вопрос по теме: как в Оракле можно эффективно реализовать constraint двуникальности? Чтобы в одной колонке находилось не более двух одинаковых значений? Ну и я таки разочаровался в твоей адекватности ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 16:41 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров НеофитSQL Вопрос по теме: как в Оракле можно эффективно реализовать constraint двуникальности? Чтобы в одной колонке находилось не более двух одинаковых значений? С удовольствием почитал 15-летнюю тему, где все еще были молодые, решали задачки и не боялись ошибаться :) Да, там было много решений, но ни одно так и не оказалось полным. Решение с построчным dbmslock мне понравилось больше всего, т.к. у меня похоже, только я использую ITL locks, которых больше. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 17:34 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
graycode НеофитSQL Если я правильно понял ваше решение, оно полагается на составной PK из двух колонок - одно для значения, второе для счетчика (1-2). Да. К сожалению, такое не работает для двух сессий. Жаль, выглядит просто и понятно (как это обычно и происходит в мире с одной сессией). ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 17:35 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL я использую ITL locks, которых больше. Вы уверены что понимаете что есть ITL? А решение есть - и оно Вам было озвучено и тут, и там. Mat.view Refresh on commit + constraint на mat.view. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 17:37 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL К сожалению, такое не работает для двух сессий. Жаль, выглядит просто и понятно (как это обычно и происходит в мире с одной сессией). У тебя штатный PK перестал работать для двух сессий? Просто и понятно, но катастрофически для производительности при массовых вставках или большом количестве дублей. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 18:39 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
andrey_anonymous НеофитSQL я использую ITL locks, которых больше. Вы уверены что понимаете что есть ITL? А решение есть - и оно Вам было озвучено и тут, и там. Mat.view Refresh on commit + constraint на mat.view. Я услышал про Mat.view Refresh on commit. Там совершенно другое поведение, запоздалое, с уникальными граблями. https://dnikiforov.wordpress.com/2011/08/25/materialized-view-and-unique-constraints/ Кроме того, в этой теме обсуждается реализация unique constraint без использования встроенного, прикрепленного к чему-то другому. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 18:59 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL Кроме того, в этой теме обсуждается реализация unique constraint без использования встроенного, прикрепленного к чему-то другому. Ты до сих пор носишься с этой бессмысленной идеей? В PL/SQL нет средств построения своих хранимых, независящих от таблиц индексов и блокировки их листов, поэтому решить эффективно можно только пользуясь стандартными индексами. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 19:09 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
graycode НеофитSQL К сожалению, такое не работает для двух сессий. Жаль, выглядит просто и понятно (как это обычно и происходит в мире с одной сессией). У тебя штатный PK перестал работать для двух сессий? Просто и понятно, но катастрофически для производительности при массовых вставках или большом количестве дублей. Я думал о следующем примере: Код: plsql 1. 2. 3. 4. 5.
Неоправданное блокирование второй сессии. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 19:13 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL Неоправданное блокирование второй сессии. А что, при обычной уникальности не висит? SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 19:24 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
graycode НеофитSQL Кроме того, в этой теме обсуждается реализация unique constraint без использования встроенного, прикрепленного к чему-то другому. Ты до сих пор носишься с этой бессмысленной идеей? В PL/SQL нет средств построения своих хранимых, независящих от таблиц индексов и блокировки их листов, поэтому решить эффективно можно только пользуясь стандартными индексами. Это "hello world" для constraints по колонкам. Если я могу решить задачу уникальности, я могу решить общий случай, где критерий уникальности ключа является внешней функцией Distance(key1,key2) < М. Например: на период пандемии натуральным id не разрешается соприкасаться (разница должна быть > 1) :) Реализовать эффективный constraint на колонке, удовлетворяющий это правило. Второй пример: для таблицы регистрации торговых знаков нужно реализовать constraint, который не позволит им быть слишком похожими друг на друга. Похожесть определяется функцией расстояния DistanceTM(clob, clob) (описание торгового знака содержится в колонке типа CLOB). Третий пример: для улучшения диверсити лотереи гринкарты было решено отсеять "слишком похожих" кандидатов, соблюдая очередность поступления. Для этого DistanceGC(row,row) считает корреляцию по 300 параметрам, и кандидат "слишком похожий" на уже имеющихся в базе, считается "дупликатом". Насколько я понимаю, в многосессионном режиме Оракл такое не умеет. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 19:36 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
SY НеофитSQL Неоправданное блокирование второй сессии. А что, при обычной уникальности не висит? SY. При обычной уникальности висит. При "двуникальности" не должен, т.к. разрешено одно повторение. При "стоникальности" подвисание 99 сессий без необходимости становится серьезным барьером для производительности. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 19:39 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL Это "hello world" для constraints по колонкам. Если я могу решить задачу уникальности, я могу решить общий случай, где критерий уникальности ключа является внешней функцией Distance(key1,key2) < М. Например: на период пандемии натуральным id не разрешается соприкасаться (разница должна быть > 1) :) Реализовать эффективный constraint на колонке, удовлетворяющий это правило. Второй пример: для таблицы регистрации торговых знаков нужно реализовать constraint, который не позволит им быть слишком похожими друг на друга. Похожесть определяется функцией расстояния DistanceTM(clob, clob) (описание торгового знака содержится в колонке типа CLOB). Третий пример: для улучшения диверсити лотереи гринкарты было решено отсеять "слишком похожих" кандидатов, соблюдая очередность поступления. Для этого DistanceGC(row,row) считает корреляцию по 300 параметрам, и кандидат "слишком похожий" на уже имеющихся в базе, считается "дупликатом". Насколько я понимаю, в многосессионном режиме Оракл такое не умеет. Кстати, раньше один эксперт хорошо известный в узких кругах пытался продавать такой продукт. В гугл - Oracle RuleGen Сейчас он сайт удалил и многое выпилено (но при умении искать можно найти), а раньше была доступна вся документация и даже исходники. Так вот "фишка" его решения была сериализация через dbms_lock. Ключевое различие в "id не разрешается соприкасаться" и озученного тобой ранее что-то типа "расстояние Левенштейна не превышает N" это то что в первом случае достаточно сравнить с двумя соседями а во втором со всеми записями в таблице. Вот тут можно пытаться сводить проблему полного перебора к неполному с помощью domain indexes (как, например, сделано в Spatial). ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 20:01 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Кобанчег Ключевое различие в "id не разрешается соприкасаться" и озученного тобой ранее что-то типа "расстояние Левенштейна не превышает N" это то что в первом случае достаточно сравнить с двумя соседями а во втором со всеми записями в таблице. Для меня это не ключевое различие, это свойство функции расстояния, которое может повлиять на скорость. На логику кода реализующего constraint уникальности влияет мало. Индекс это полезная, но ортогональная оптимизация. Если строки короткие, я могу построить индекс в пространстве Левенштейна (а не линейный) и вместо полного перебора сравнивать только 2N соседей в N измерениях. Мое желание скопировать поведение PK связано с тем, что оно хорошо отполировано и широко известно. Лучше для общего случая я не придумаю. Пока я решил для insert (в пределах возможностей моих 3-сессионных тестов). Если не найду интереснее задачек, допилю delete/update. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 20:16 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Почитал про Oracle RuleGen, интересно. Учитывая количество подводных камней для multirow constraints, было бы намного лучше чтобы такие задачи решались профессионально. Еще лучше - чтобы были встроены в БД производителем, или продавались как надстройка. Даже если окажется что я худо-бедно и в основном на ощупь один раз правильно реализовал multirow constraint в триггере, это не значит что такой код легко сопровождаемый, или что я не сделаю ошибку в следующий раз в немного усложненной ситуации. Свои цели в этом вопросе я достиг, обработку конфликтов в PK понимаю намного лучше чем пару дней назад, использовал select..for update почти по прямому назначению, и увидел что большинство решений тяготеют или к MV-on-commit или GTT+автономные транзакции (я использовал второе). ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 20:40 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL Учитывая количество подводных камней для multirow constraints, было бы намного лучше чтобы такие задачи решались профессионально. Еще лучше - чтобы были встроены в БД производителем, или продавались как надстройка. Проверки в хранимках и сериализация нужна только на время выполнения проверки. Зачем еще какие-то надстройки? Дать возможность декларативно описывать multirow constraints слишком опасная граната в руках обезьян. НеофитSQL Даже если окажется что я худо-бедно и в основном на ощупь один раз правильно реализовал multirow constraint в триггере ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 21:12 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
Кобанчег, Хранимки или триггер - это я считаю вопрос обертки. Для реализации insert главной проблемой оказалось научиться делать dirty reads. Потому что PK это делает, а Оракл сессиям это запрещает. Тогда и начинаются пляски с бубном как сделать row lock на строке, которой ещё нет в таблице. Забудем про триггеры на минутку. Вот хранимка InsertUniqueindex(id in integer) которая вставляет уникальный id в одну определенную таблицу, изначально пустую. Надо чтобы первый вызов для id=1 прошел успешно, второй отказался (это легко, контекст одной сессии). А теперь надо чтобы из всех других сессий вызовы с id=1 застряли пока первая сессия не совершит commit/rollback. Вот где не хватает dirty read. Тут нужен глобальный сериализующий объект который соблюдает очередность. По одному такому локу на каждый id, и желательно используемый без лишних переключений контекста. Я использовал ITL, как это делает сам оракл. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 21:36 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
НеофитSQL, В принципе все что нужно было бы это возможность указать NOWAIT в INSERT/UPDATE. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 22:35 |
|
Реализация уникальности без ключей и индексов
|
|||
---|---|---|---|
#18+
SY НеофитSQL, В принципе все что нужно было бы это возможность указать NOWAIT в INSERT/UPDATE. SY. Если вы о реализации двуникального ключа, то да. Но это противоречит принципу запрета dirty reads, позволяя узнавать что постит другая сессия до commit. Если вы о моей попытке смастерить PK своими силами, то вряд ли поможет, ведь insert не блокирует в отсутствие встроенного unique constraint. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 23:00 |
|
|
start [/forum/topic.php?all=1&fid=52&tid=1880705]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
141ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
109ms |
get tp. blocked users: |
1ms |
others: | 295ms |
total: | 583ms |
0 / 0 |