|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Навеяно другой темой, про constraints и проверку данных на вшивость. Задана таблица EMPLOYEES с полями employee_id и manager_id типа integer. Таблица описывает строгую древовидную иерархию, с одним гендиректором наверху. Как в SQL (или в PL/SQL, чтоб легче) подтвердить правильность древовидной структуры? Критерии правильности древовидности довольно очевидна но на всякий случай в вики есть определение: https://ru.wikipedia.org/wiki/Дерево_(структура_данных) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 02:41 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 03:34 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL, На форуме ужн многократно обсуждалось, решения элементарные, а на современных версиях ещё легче. Но ты пиши, посмотрим... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 03:57 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Relic Hunter Код: plsql 1.
Лаконично. Похоже, что производится подсчет гендиректоров, из предположения что гендиректор помечен null. Это не единственный способ отметить гендиректора, но вполне рабочий. Для этого manager_id придется сделать nullable, расслабив одно из ограничений. Этот тест отловит таблицы где нет гендиректоров, или более одного гендиректора. Некоторые вещи он пропустит. Код: plaintext 1. 2. 3. 4. 5. 6.
У меня пока тоже не получается записать эту задачу на SQL, т.к. мое решение полагается на цикл, а с циклами в SQL туго. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 06:08 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL, проверить что все "узлы" employee_id в дереве и нет циклов? ps connect by, with ... .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 10:13 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL Некоторые вещи он пропустит. Код: plaintext 1. 2. 3. 4. 5. 6.
Пропустит, но не это. Это предотвращается а не проверяется. Например через FBI на EMPLOYEES(1 / (EMPNO - MGR)) или через calculated column X = EMPNO - MGR плюс check constraint CANT_SELFREPORT на X != 0. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 13:25 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
SY НеофитSQL Некоторые вещи он пропустит. Код: plaintext 1. 2. 3. 4. 5. 6.
Пропустит, но не это. Это предотвращается а не проверяется. Например через FBI на EMPLOYEES(1 / (EMPNO - MGR)) или через calculated column X = EMPNO - MGR плюс check constraint CANT_SELFREPORT на X != 0. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 13:39 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Мне приятно, что есть желающие размять мозги и возможно, блеснуть кодом. Действительно, можно ввести проверку на eid != mid (давайте сократим эти поля employee_id и manager_id). Такая проверка исключит тривиальные циклы. Но пропустит более длинные. Контрпример: цикл из двух, не ловится вышеописанной проверкой. Код: plaintext 1. 2. 3. 4. 5.
В этом контрпримере, в "хорошей" таблице строчки 2-3 подчинены гендиректору, а в "плохой" таблице - друг другу (цикл). Цикл может быть из трех и более - нужно ловить все. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 13:48 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
кит северных морей а просто чек на empno != mgr? Brain fart SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 13:51 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL В этом контрпримере, в "хорошей" таблице строчки 2-3 подчинены гендиректору, а в "плохой" таблице - друг другу (цикл). Цикл может быть из трех и более - нужно ловить все. А это без сериализации не предотвращается а проверить можно только полным проходом по дереву. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 13:58 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Stax НеофитSQL, проверить что все "узлы" employee_id в дереве и нет циклов? ps connect by, with ... .... stax Чувствуется человек с опытом работы - первым делом уточнил условия задачи. Дополнение к первому сообщению, более конкретные условия задачи: 1) гендиректор обозначается manager_id (mid) = null 2) пустая таблица не считается деревом 3) таблица из одного и более элементов может быть деревом (только гендиректор - считать деревом) 3) в дереве ровно один ген директор 4) циклы в графе запрещены - у дерева не бывает циклов 5) каждый сотрудник должен быть напрямик или через других подчинен гендиректору 6) результат функции или запроса должен говорить "дерево" или "не дерево" (true/false, 1/0, на усмотрение) 7) код должен отрабатывать за конечное время, быстрее - лучше Я заметил что в коммерческих решениях зачастую вершина дерева помечается как mid=eid, а не как mid=null. Думаю, что это делается с целью усиления constraints, тогда mid можно определить non-nullable внешний ключ. Если к этому добавить запрет на mid=eid для INSERT, будет невозможно испортить дерево при добавлении сотрудников. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 14:06 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL Цикл может быть из трех и более - нужно ловить все. connect by нельзя пльзоваться? .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 14:09 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Тривиально: пройтись по всем записям, выстраивая иерархию от подчиненного к менеджеру. Обработать exception "connect-by loop in user data" либо проконтролировать соответствующий флаг. Отобрать листья. Сгруппировать листья и убедиться, что результатом группировки является единственная запись и эта запись соответствует корню иерархии. Фсьо. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 14:19 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Можно пользоваться connect by, и любыми другими встроенными средствами Оракл. Если там есть встроенная команда проверки всего дерева, то это было бы самым правильным решением. Кстати, я не знал про существование connect by до этого момента, сейчас читаю как эта конструкция обрабатывает циклы. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 14:39 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Уважаемый, уже несколько дней наблюдаю за Вашим творчеством. Не скрою,увлекательно. Продолжайте пожалуйста. Только огромная просьба: пожалуйста, ни в коем случае не изучайте выбранный технологический стек, не читайте документацию - от этого Ваши сообщения могут существенно потерять в лулзах. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 14:44 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL Если там есть встроенная команда проверки всего дерева, В множестве типа "куча" нет деревьев, но можно хранить записи, имеющие логические ссылки на соседние. На этом всё. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 14:54 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
andrey_anonymous Тривиально: пройтись по всем записям, выстраивая иерархию от подчиненного к менеджеру. Обработать exception "connect-by loop in user data" либо проконтролировать соответствующий флаг. Отобрать листья. Сгруппировать листья и убедиться, что результатом группировки является единственная запись и эта запись соответствует корню иерархии. Фсьо. Это звучит как решение. Вряд ли я такое сегодня смогу написать на SQL. А вот connect-by/noloop - очень полезная штука, я о ней до этого не знал. С этим оператором задача упрощается в разы. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 15:04 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL С этим оператором задача упрощается в разы. Не упрощается. В многопользовательском режиме (что есть стандарт) такая проверка (CONNECT BY) ничего не гарантирует. Без сериализации тут не обойтись. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 15:14 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQLКак в SQL (или в PL/SQL, чтоб легче) подтвердить правильность древовидной структуры? Составной ключ id+уровень иерархии, соответствующий FK и сверху chеck, проверяющий уровень иерархии менеджера выше, чем у работника. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 15:21 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
SY, Да что ж вы делаете-то... Остановитесь! Сейчас ещё одна же тема появится, теперь про уровни изоляции транзакций и мини-откаты... Прямо галопом по европам... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 15:23 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov НеофитSQLКак в SQL (или в PL/SQL, чтоб легче) подтвердить правильность древовидной структуры? Составной ключ id+уровень иерархии, соответствующий FK и сверху chеck, проверяющий уровень иерархии менеджера выше, чем у работника. Идея понятна, но уровень иерархии не определен для циклов. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 15:29 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQLуровень иерархии не определен для циклов. В дереве не существует циклов. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 15:32 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
SY В многопользовательском режиме (что есть стандарт) такая проверка (CONNECT BY) ничего не гарантирует. Без сериализации тут не обойтись. SY. В многопользовательском режиме CONNECT BY исполняется по-другому, и ему нельзя доверять? Я написал следующее условие, которое true если дерево, и false если не дерево. Оно использует connect by, оно сломается и даст неверные данные в многопользовательском режиме? Или вы говорите о ситуации, когда таблица меняется во время исполнения проверок? Если так, то добавим условие что таблицу считать статической на время проверки (напр., копия) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 15:51 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov НеофитSQLуровень иерархии не определен для циклов. В дереве не существует циклов. Действительно. У дерева нет циклов, и ровно один корень. Условие этой головоломки - определить представляет ли таблица правильное дерево. Ваше предложенное решение начинается с "предположим, что это правильное дерево, где определен уровень иерархии.." :) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 15:56 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL В многопользовательском режиме CONNECT BY исполняется по-другому, и ему нельзя доверять? Поскольку в однопользовательском вы будете работать исчезающе редко, лучше сразу прочитать Oracle Database Concepts, о чем вам уже несколько дней повторяют, и выкинуть свой устав, придя в этот монастырь. и не выдумывать фантастических ситуаций таблицу считать статической на время проверки (напр., копия) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 15:59 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQLУсловие этой головоломки - определить представляет ли таблица правильное дерево. Если создание описанных ограничений на реальной таблице закончится с ошибкой их проверки - дерево неправильное. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 16:07 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov НеофитSQLУсловие этой головоломки - определить представляет ли таблица правильное дерево. Если создание описанных ограничений на реальной таблице закончится с ошибкой их проверки - дерево неправильное. Так тоже можно. Начать с предположения что дерево правильное, попробовать применить операции которые вылетят на плохом дереве, и словить exception, который скажет об определенном аспекте неправильности дерева. Это теория; пока кода нет, море по колено :) На практике, вместо вылета кода можно попасть в бесконечный цикл, вычисляя уровень иерархии на цикле. Бесконечный цикл не соответствует постановке задачи (запрос/функция должна вернуться в конечное время). ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 16:17 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL, про бесконечный цикл вам рассказали во второй строке вот этого сообщения: andrey_anonymous Тривиально: пройтись по всем записям, выстраивая иерархию от подчиненного к менеджеру. Обработать exception "connect-by loop in user data" либо проконтролировать соответствующий флаг. Отобрать листья. Сгруппировать листья и убедиться, что результатом группировки является единственная запись и эта запись соответствует корню иерархии. Фсьо. Речь здесь идет об ошибке времени выполнения, т.е. фетча. Альтернативно, вместо генерации ошибки, в рекурсивном варианте запроса можно заказать пометку зацикливающихся строк. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 16:30 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Обкатав мое решение на нескольких таблицах разной степени поломанности, я комфортабельно его размещаю как одно из возможных правильных. Вчера я не знал, как это написать в виде запроса, только алгоритмически с PL/SQL. Сегодня, благодаря участникам форума я освоил один из вариантов connect-by. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Мне неизвестна скорость данного решения, и нет возможности проверить эмпирически. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 16:42 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL Код: plsql 1.
НеофитSQL Код: plsql 1.
НеофитSQL 1) убедиться что ровно один корень (это также отсечет пустые таблицы) это можно сделать навесив уникальный ключ на decode(mid,null,1) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 16:57 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQLНа практике, вместо вылета кода можно попасть в бесконечный цикл, вычисляя уровень иерархии на цикле. Нельзя если запрос составлен правильно. Ну а кривыми руками неофита можно что угодно колом поставить. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 17:14 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Подведем итоги. Головоломка решена, одним из способов. Были поползновения сделать вклад от некоторых участников, но побрюзжав с галерки, они так и не родили ни единой строчки рабочего кода, сберегая силы. Несомненно, что справились бы одной левой если б только.. connect-by - отличная штука, и даже умеет обрабатывать циклы, когда требуется. Как было неоднократно упомянуто уважаемыми коллегами, использование constraints позволяет сохранить ссылочную целостность, хотя бы частично. Например, в головоломке используется таблица EMPLOYEES такого сорта: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Уникальные ID? сделано через PK Контроль ссылок менеджера? сделано через FK (но позволен null, для гендиректора) Защита от тривиальных циклов? Есть, проверка NOSELFREPORT Защита от лишних гендиректоров? Тут проблема, синтакс не позволяет select, поэтому такую проверку скорее всего делают в триггере. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 17:43 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQLпоэтому такую проверку скорее всего делают в триггере. Нет, не делают, потому что и там она совершенно неработоспособна. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 17:44 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL, Молодец. А практический смысл у этой задачи какой? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 17:47 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL Мне неизвестна скорость данного решения, и нет возможности проверить эмпирически. табличка не дерево Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 17:49 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Stax, точно, это не дерево. Но нарушена ссылочная целостность, которая .... погодите... так и не была указана в условиях задачи. Контрпример принимается - алгоритм не все ловит. Наметаный у вас, однако, глаз! Оказывается дело даже не в желтой строчке, мой алгоритм отлавливает несуществующих менеджеров. Дело в том, что нарушена уникальность работников (номер 3 есть дважды), и вот это привело к +1/-1. Использую ваш контрпример, чтобы добавить еще одно условие - уникальность eid и его наличие. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 18:29 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL В многопользовательском режиме CONNECT BY исполняется по-другому, и ему нельзя доверять? Похоже у тебя нет понятия что такое многопользовательский режим. Если Петя и Вася открыли один и тот-же файл в notepad Петя не видит Васины изменения а Вася Петины. То же и в Oracle. Петя поменял mgr Маши на себя но еще не закоммитил а в это время Вася поменял Петиного mgr на Машу. Оба запустили проверку и все пучком ибо Петя не видит Васины изменения а Вася Петины хотя есть цикл. И без сериализации тут никак. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 18:38 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL Головоломка решена НеофитSQL Были поползновения сделать вклад от некоторых участников, но побрюзжав с галерки, они так и не родили ни единой строчки рабочего кода, сберегая силы.Несомненно, что справились бы одной левой если б только.. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 19:01 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Адекватные решения известны и сто раз на форуме озвучивались. Самое правильное - использовать единую точку входа, т.е создать процедуру и использовать ее. Простой пример: тестовая табличка с данными Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
пример процедуры для изменения ссылки на родительскую запись Код: 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.
Пример обновлений: Код: 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.
Другое решение (крайне не рекомендуемое из-за потенциальной несогласованности) - использовать materialized view on commit c проверкой: создаем функцию с проверкой Код: 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.
создаем materialized view Код: plsql 1. 2. 3. 4. 5. 6.
пример обновлений Код: 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.
Итого: без блокировки родительских строк 100% обеспечить надежность проверки нельзя ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 19:26 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
SY НеофитSQL В многопользовательском режиме CONNECT BY исполняется по-другому, и ему нельзя доверять? Похоже у тебя нет понятия что такое многопользовательский режим. Если Петя и Вася открыли один и тот-же файл в notepad Петя не видит Васины изменения а Вася Петины. То же и в Oracle. Петя поменял mgr Маши на себя но еще не закоммитил а в это время Вася поменял Петиного mgr на Машу. Оба запустили проверку и все пучком ибо Петя не видит Васины изменения а Вася Петины хотя есть цикл. И без сериализации тут никак. SY. Это объяснение на доступном мне языке. Пример внятный, но он относится к писакам, а не к читакам. Я по неопытности перепугался что мне вася/петя могут таблицу изменить во время исполнения моего запроса. Но, почитав документацию, успокоился - Оракл гарантирует что моему запросу на лету таблицу не изменят, поэтому программистам читающего кода о таких вещах беспокоиться не приходится. Тем более в головоломке на сообразительность. Про сериализацию нашел материал, почитаю как Оракл разрешает коммит- и другие конфликты. Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 19:28 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
virtual columns + check constraint основанные на такой функции будут вызывать ORA-04091: table is mutating, trigger/function may not see it: Код: 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.
Код: plsql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 19:43 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL Я по неопытности перепугался что мне вася/петя могут таблицу изменить во время исполнения моего запроса. Но, почитав документацию, успокоился - Оракл гарантирует что моему запросу на лету таблицу не изменят Ты, по неопытности, не пугашлся ибо лезешь напролом не осозновая опасностей. "Оракл гарантирует что моему запросу на лету таблицу не изменят" - это и есть statement level read consistency, a.k.a. запрос видит данные так как они были на момент запроса. Т.е. изменения даже закоммиченные но после твоего запроса проверки целостности дерева не увидит и цикл прошляпит. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 19:46 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
xtender Итого: без блокировки родительских строк 100% обеспечить надежность проверки нельзя Много красивого и интересного кода, с удовольствием посмотрел, кое-что понял. SY и xtender подняли тему важную тему сериализации/блокировки, важную для сохранения целостности данных. Мое мнение по этому поводу: программисты которые пишут только читающий код (те же запросы), имеют полный иммунитет, и вправе писать запросы как если бы они были единственным пользователем этой базы. select count(*) from TABLE всегда даст правильное число строчек для того контекста, в котором она вызвана. Для писаки Васи это пять, для писаки Пети восемь, а для читаки Нины - три. Вся ответственность за контролем доступа, избеганием дедлоков и другими интересными вещами лежит только на коде, который пишет в базу, и больше ни на ком другом. Я не представляю ситуацию, когда читающий код возьмет лок, без всякого намерения писать в базу. Случай (SELECT ... FOR UPDATE) сюда не входит, читаки его не вызывают. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 19:47 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
SY НеофитSQL Я по неопытности перепугался что мне вася/петя могут таблицу изменить во время исполнения моего запроса. Но, почитав документацию, успокоился - Оракл гарантирует что моему запросу на лету таблицу не изменят Ты, по неопытности, не пугашлся ибо лезешь напролом не осозновая опасностей. "Оракл гарантирует что моему запросу на лету таблицу не изменят" - это и есть statement level read consistency, a.k.a. запрос видит данные так как они были на момент запроса. Т.е. изменения даже закоммиченные но после твоего запроса проверки целостности дерева не увидит и цикл прошляпит. SY. "Чукча не писатель, чукча читатель". У читающего кода нет никаких обязанностей по поводу чужих контекстов. Поэтому они никогда не берут локи. Соответственно, авторы пишущего кода должны понимать что даже если их контекст зеленый, это не гарантирует безопасность их коммита, потому при отсутствии сериализации другой коммит мог влезь. И ты меня хочешь об этом предостеречь. Это интересная и сложная тема, с которой я буду разбираться когда начну писать в таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 20:07 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL размещаю как одно из возможных правильных. Ну раз размещаете... то вот Вам еще одно "возможно правильное" :) Я обычно в таких ситуациях накидываю 5-6 вариантов, но сегодня что-то слишком много смеялся. Код: plsql 1. 2. 3. 4. 5.
Вообще тут есть давнее правило: - задающий вопрос публикует тестовые данные, ожидаемый результат и свою попытку решить задачу - загадывающий "пятничную задачку" изначально знает ответ Примите во внимание - и коллеги не будут обходиться одними лишь ехидными комментариями. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 20:22 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL select count(*) from TABLE всегда даст правильное число строчек для того контекста, в котором она вызвана. Чтите концепты ибо они рулез. Умолчательный уровень изоляции делает Ваше утверждение в общем случае не верным, если Вы выдаете несколько запросов подряд. К примеру, следующий за select count(*) запрос может зависеть от полученного результата, но "контекст" (на самом деле точка согласования, контекст в oracle - это другое) у него будет уже иной. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 20:32 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
andrey_anonymous НеофитSQL select count(*) from TABLE всегда даст правильное число строчек для того контекста, в котором она вызвана. Чтите концепты ибо они рулез. Умолчательный уровень изоляции делает Ваше утверждение в общем случае не верным, если Вы выдаете несколько запросов подряд. К примеру, следующий за select count(*) запрос может зависеть от полученного результата, но "контекст" (на самом деле точка согласования, контекст в oracle - это другое) у него будет уже иной. Резонно. Я с этим не сталкивался, но из похожих соображений не так давно переделал код из такого: Код: plsql 1. 2. 3. 4. 5.
в код, где ловил exception. Не было уверенности что эти два селекта вызвались бы на одном и том же контексте точке согласования. Я ожидаю много интересного когда потребуется делать изменения в базу. Благо, в моем коллективе есть опытные кодеры. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 20:49 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL Код: plsql 1. 2. 3. 4. 5.
Один из самых дурных антипаттернов в моем личном рейтинге. Если уж очень-очень надо , то существование записи лучше проверять Код: plsql 1. 2. 3.
но это тоже не фонтан. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 20:55 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL, Последняя попытка. Код: 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.
Имеем: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Сессия 1: Код: 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.
Все пучком. В это же время сессия 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.
Все пучком и обе сессии со спокойной совестью делают commit. В результате имеем: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 21:12 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
SY Последняя попытка. Соломон, не надо нагнетать. ТС не ставил задачу "обеспечить целостность". Он ставил задачу "проконтролировать, что в таблице дерево" на предмет "поучиться sql-ить". И даже пробовал отбиться от ревнителей посредством блокировки :) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 21:19 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
xtender virtual columns + check constraint основанные на такой функции Тут уместнее доменный индекс, кмк. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 21:38 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
andrey_anonymous ТС не ставил задачу "обеспечить целостность". А, вот она, магическая формулировка с помощью которой можно достучаться к экспертам. Соломон, я хорошо понял (со второго раза, когда появились петя и маша) про опасности одновременно пишущих сессий, когда два отдельно ненарушающих действия (заменить скамейку и покрасить скамейку) приводят к нежелаемому результату, что скамейку покрасили, а потом выбросили. У меня действительно нет задачи обеспечить целостность ни в головоломке (она read-only), ни в моей работе в настоящее время. Когда я больше узнаю про механизмы синхронизации, и как они уже применяются в существующем коде, я смогу общаться на эту тему более полно. На некоторое время, это будет сознательно вне моей сферы. Код "последней попытки" я прочитал, все понятно. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 21:53 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
xtender virtual columns + check constraint основанные на такой функции будут ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2020, 07:52 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
НеофитSQL точно, это не дерево. Но нарушена ссылочная целостность, которая .... погодите... --- Дело в том, что нарушена уникальность работников (номер 3 есть дважды) eid=3 работает на два проекта, "Astra" менеджер eid=1 и "Lada" менеджер eid=4 .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2020, 08:38 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Elic xtender virtual columns + check constraint основанные на такой функции будут Хм..., я бы отдал голос за то, что иногда можно . Это не обман, а элемент декларации, т.е. интерфейса, значимого для SQL-машины. В этом отношении, будь я SQL-машиной, я бы так разработчику говорил - это твое дело, разработчик. Раз ты делаешь это, я верю в то, что понимаешь, что делаешь. Да, такие функции можно и в индекс "вставить". А вот обманываешь ты при этом себя, или нет - это не технический для меня вопрос, а вопрос твоего образования. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2020, 09:35 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
booby А вот обманываешь ты при этом себя, или нет - это не технический для меня вопрос, а вопрос твоего образования. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2020, 09:49 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Elic, это не математика, это техника, в которой с математикой обходятся применяя "инженерный подход". И это... уверенность в понимании может приводить и приводит, как к катастрофическим ошибкам, так и к отказам от рабочих решений. В военное время уверенное понимание может заканчиваться расстрелом перед строем. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2020, 10:04 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Я декларировал функции deterministic для обработки строчек, например. Согласно докам, это позволяет оптимизатору сохранить результат, и не вызывать функцию много раз с одним и тем же параметром. Только что проверил, так и есть (функция fPrint(s1,s2) заявлена deterministic, возвращает первый параметр. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Убрал deterministic, снова вызывается три раза. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2020, 19:53 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
Elic, Ты говоришь про идеальный мир или про реальный? В реальном мире даже иногда надо. Только надо знать как именно deterministic работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2020, 20:04 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
xtender В реальном мире даже иногда надо. Только надо знать как именно deterministic работает. xtender Ты говоришь про идеальный мир или про реальный? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 06:51 |
|
Проверка на циклы в иерархической таблице(Головоломка)
|
|||
---|---|---|---|
#18+
xtender даже иногда надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 07:16 |
|
|
start [/forum/topic.php?all=1&fid=52&tid=1880888]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
99ms |
get tp. blocked users: |
1ms |
others: | 30ms |
total: | 209ms |
0 / 0 |