Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4 5   вперед  Ctrl      все
 Re: Реализация уникальности без ключей и индексов  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
Но ведь так можно сразу посылать любого?

Мне дети говорят -- я бы может и устроился на такую работу, но староперды реально гнобят за незнание чего-то там
И я вместе с ними негодую
Хотя реально такой же староперд и с такими же претензиями

Я к тому, что нужно и критиковать, но и обсуждать решения, а не сразу их отметать
14 ноя 20, 13:03    [22232007]     Ответить | Цитировать Сообщить модератору
 Re: Реализация уникальности без ключей и индексов  [new]
Elic
Member

Откуда:
Сообщений: 29991
Вячеслав Любомудров
Но ведь так можно сразу посылать любого?
Нет. Ответь сам себе на вопрос: что-то новое внесено в "базу знаний форума"? Или чудак (если он не тролль) тут решил расплескать свой личный блог в духе "О-о-о... Какая крутая бабочка!" ?
14 ноя 20, 13:23    [22232017]     Ответить | Цитировать Сообщить модератору
 Re: Реализация уникальности без ключей и индексов  [new]
graycode
Member

Откуда:
Сообщений: 468
Вячеслав Любомудров
но и обсуждать решения

Зачем обсуждать решения человека который не желает учиться и вместо того чтобы сначала изучить, понять и осознать, лепит ахинею и вываливает ее на форум?
14 ноя 20, 13:23    [22232018]     Ответить | Цитировать Сообщить модератору
 Re: Реализация уникальности без ключей и индексов  [new]
Elic
Member

Откуда:
Сообщений: 29991
Вячеслав Любомудров
Я к тому, что нужно и критиковать, но и обсуждать решения, а не сразу их отметать
А можно входить в форум адекватно. Вспомни, например, Никотина. Про Саяна я вообще не говорю.
14 ноя 20, 13:25    [22232020]     Ответить | Цитировать Сообщить модератору
 Re: Реализация уникальности без ключей и индексов  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10784
Вячеслав Любомудров
но староперды реально гнобят за незнание чего-то там
Вот прямо сразу в лоб гнобят или после того, как юный талант с тонкой душевной организацией начал хлопать глазами и хлюпать носом вместо "копать отсюда и до решения"?

P.S.
Никогда не обращали внимание на "военную" терминологию и риторику бизнеса?
Это, конечно плохо: командир своей жизнью отвечает за жизнь подчинённых, а у бизнеса такой ответственности - нет.
Но, по факту, бизнес это война и не очень понятно, почему надо обхаживать какого-нибудь цатилетнего лба, который ведёт себя как дошколёнок.
14 ноя 20, 13:29    [22232023]     Ответить | Цитировать Сообщить модератору
 Re: Реализация уникальности без ключей и индексов  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
Elic
Вячеслав Любомудров
Но ведь так можно сразу посылать любого?
Нет. Ответь сам себе на вопрос: что-то новое внесено в "базу знаний форума"? Или чудак (если он не тролль) тут решил расплескать свой личный блог в духе "О-о-о... Какая крутая бабочка!" ?
Он не первый, не последний
В его плесканиях я вижу адекватную реакцию на критику и таки чтение (и, отправление к) доке
Это уже дорогого стоит

Да блин, я точно также буду гнобить за кривую идею, построенную на неправильных предпосылках
Или не буду

Кстати, тот же Саян, как мне кажется, именно через наш форум, решил куда ему дальше расти и этот форум был очень неплохим учебником/общением, и его тут тоже за глупости неплохо ругали
И много их таких...
И, возможно, скоро именно неофит будет отвечать в команде дядюшки Тома
14 ноя 20, 13:51    [22232030]     Ответить | Цитировать Сообщить модератору
 Re: Реализация уникальности без ключей и индексов  [new]
Elic
Member

Откуда:
Сообщений: 29991
Вячеслав Любомудров
Кстати, тот же Саян,
Попытка сравнения оскорбительна, как по мне.
Лично я никого толкового никогда не гнобил, только направлял. Надеюсь (и не безпочвенно), это имело определённый успех.
14 ноя 20, 14:04    [22232037]     Ответить | Цитировать Сообщить модератору
 Re: Реализация уникальности без ключей и индексов  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
Дык я тоже на такое надеюсь
К сожалению, не все оценили
14 ноя 20, 14:10    [22232039]     Ответить | Цитировать Сообщить модератору
 Re: Реализация уникальности без ключей и индексов  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
Виталий, я ведь тоже начинаю ругаться, когда приходят неофиты и начинают шатать основы
Более того, ругаюсь, когда они не просто свои фантазии реализуют, а начинают отвечать, типо это правильно
Но ведь от них никуда не деться, кто-то же должен (прийти и подхватить знамя) продолжать работать
Очень обидно, когда это знамя подхватывают просто неучи
Еще обидней, когда они в силу возраста/тупизны проталкивают вот эти свои совершенно глупые (но, кажущиеся им самыми умными) идеи

Как по мне -- этот топик как раз доведение до абсурда, но это задание на соображулесть -- и автор вполне его прошел -- так что 5- по моей скромной оценке
14 ноя 20, 14:23    [22232045]     Ответить | Цитировать Сообщить модератору
 Re: Реализация уникальности без ключей и индексов  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
НеофитSQL

Замените на гугол, SCN точно меньше гугола.


Ну заменил:

+

SQL> create table TEST23(uq INTEGER);

Table created.

SQL> create table TEST_U(id INTEGER);

Table created.

SQL>
SQL> create or replace trigger tr_test23
  2    before insert on test23
  3    for each row
  4  declare
  5    PRAGMA AUTONOMOUS_TRANSACTION;
  6    n integer;
  7    l integer := -1;
  8  begin
  9    if :new.uq is null then raise VALUE_ERROR; end if; -- better ORA-01400: cannot insert NULL
 10
 11    -- check among commited values
 12    select count(*) into n from dual
 13     where exists (select 1 from test23 where uq = :new.uq);
 14
 15    if n > 0 then raise DUP_VAL_ON_INDEX; end if;
 16
 17    -- take lock to avoid TOCTOU
 18    l := dbms_lock.request( 1001234567, dbms_lock.X_MODE );
 19    if l != 0 then raise TIMEOUT_ON_RESOURCE; end if;
 20
 21    -- clean helper table from rows older than commited data
 22    delete from test_u u
 23     where u.ora_rowscn <= nvl((select max(t.ora_rowscn) from test23 t),power(10,100));
 24    commit;
 25
 26    -- count matching uncommited values from other sessions
 27    select count(*) into n from test_u u where u.id = :new.uq;
 28
 29    if n > 0 then raise DUP_VAL_ON_INDEX; end if;
 30
 31    -- this will remember uncommited value from this session
 32    insert into test_u (id) values(:new.uq);
 33    commit;
 34
 35    l := dbms_lock.release( 1001234567 );
 36  exception
 37    when others then
 38      if l = 0 then l := dbms_lock.release( 1001234567 ); end if;
 39      raise;
 40  end tr_test23;
 41  /

Trigger created.

SQL>



SQL> insert into test23 values(1);

1 row created.

SQL> insert into test23 values(1);

1 row created.

SQL> insert into test23 values(1);

1 row created.

SQL>


Доку по традиции не читаем (что видит и что не видит autonomous transaction).

SY.

Сообщение было отредактировано: 14 ноя 20, 14:37
14 ноя 20, 14:34    [22232047]     Ответить | Цитировать Сообщить модератору
 Re: Реализация уникальности без ключей и индексов  [new]
Elic
Member

Откуда:
Сообщений: 29991
Вячеслав Любомудров
так что 5- по моей скромной оценке
Заболталенг ему тобой зачтён. И всего то.
14 ноя 20, 14:47    [22232052]     Ответить | Цитировать Сообщить модератору
 Re: Реализация уникальности без ключей и индексов  [new]
кит северных морей
Member

Откуда: krsk / nyc / krsk
Сообщений: 882
Вячеслав Любомудров
начинаю ругаться, когда приходят неофиты и начинают шатать основы

хз. мне именно этим и интересны посты неофита с неконвенциональными подходами. уж точно интереснее и полезнее тысяч комментариев формата "ну тупоооой", которых даже в этом треде полно.

я вообще не понимаю, что такое "расшатать основы". я либо в состоянии на пальцах и с примерами объяснить, почему что-то делать не надо, либо, если я не в состоянии, то это всегда повод спросить себя - а так ли я прав?
14 ноя 20, 14:58    [22232059]     Ответить | Цитировать Сообщить модератору
 Re: Реализация уникальности без ключей и индексов  [new]
graycode
Member

Откуда:
Сообщений: 468
кит северных морей,

Неофит отказывается изучать и понимать многопользовательский доступ к одному ресурсу, ему почему то кажется, что если он напишет много бредового кода, то законы природы перестанут действовать.
14 ноя 20, 15:08    [22232063]     Ответить | Цитировать Сообщить модератору
 Re: Реализация уникальности без ключей и индексов  [new]
Elic
Member

Откуда:
Сообщений: 29991
кит северных морей
уж точно интереснее и полезнее тысяч комментариев формата "ну тупоооой"
Так в чём польза то? Про интерес не спрашиваю: попкорн - он везде попкорн.
14 ноя 20, 15:09    [22232064]     Ответить | Цитировать Сообщить модератору
 Re: Реализация уникальности без ключей и индексов  [new]
кит северных морей
Member

Откуда: krsk / nyc / krsk
Сообщений: 882
Elic
Так в чём польза то?
я не знаю как складывалась ваша карьера. моя складывалась (и продолжает складываться) так, что большинству того, что я умею, меня никто специально не учил - я научился сам. читал книжки, статьи, пытался как-то осмыслить увдиенное у коллег, или просто тыкался по интернету как слепой котенок, если знаний совсем не хватало.

понятие "основы" за это время трансформировалось неоднократно. например, когда-то давно одной из "основ" для меня было мнение, что ссылочная целостность данных должна обеспечиваться декларативными ограничениями, и никак иначе. потом я ляпнул это на каком-то интервью, а мне в ответ сказали, что у них в системе вообще ни одного FK нет. разрыв шаблона, основа пошатнулась, и со временем сдвинулась в более правильном направлении.

соответственно такие, кажущиеся неконвенциальными мнения - это всегда reality check. точно ли мнение неконвенциальное, или может просто это ты сам дурак? и польза как раз в том, что дураком время от времени оказываешься ты сам.

наверное, когда вам сначала системно кладут знания в голову в правильном порядке, а потом вы начинаете их применять - это не так критично. но это, как я сказал, не мой случай.
14 ноя 20, 15:56    [22232074]     Ответить | Цитировать Сообщить модератору
 Re: Реализация уникальности без ключей и индексов  [new]
НеофитSQL
Member

Откуда: Маями
Сообщений: 760
SY,

это мой баг. Поспешил-людей насмешил. Переделал сборку мусора во вспомогательной таблице, не заметил ошибки в случае, когда таблица пустая. Правку с гуголом писал перед сном, снова не проверил :) Там нужен не Inf, не гугол а ноль. Я думаю вы и сами давно заметили и разобрались.

Извините, что потратил ваше время, надеюсь, copy/paste много не отнял.
Если есть желание, проставьте 0 в nvl, или просто сделайте первый коммит чтобы сделать таблицу непустой, потом все должно работать штатно:

SQL> insert into test23 values(1);
1 row inserted

SQL> commit;
Commit complete

SQL> insert into test23 values(1);
insert into test23 values(1)
ORA-00001: unique constraint (.) violated
ORA-06512: at "TR_TEST23", line 36
ORA-04088: error during execution of trigger 'TR_TEST23'

SQL> insert into test23 values(2);
1 row inserted

SQL> insert into test23 values(2);
insert into test23 values(2)
ORA-00001: unique constraint (.) violated
ORA-06512: at "TR_TEST23", line 36
ORA-04088: error during execution of trigger 'TR_TEST23'


С нулем, первый коммит не нужен:

+
SQL> delete test23;
1 row deleted

SQL> delete test_u;
1 row deleted

SQL> commit; -- empty tables now
Commit complete

SQL> insert into test23 values(1);
1 row inserted

SQL> insert into test23 values(1);
insert into test23 values(1)
ORA-00001: unique constraint (.) violated
ORA-06512: at "TR_TEST23", line 36
ORA-04088: error during execution of trigger 'TR_TEST23'
15 ноя 20, 01:04    [22232235]     Ответить | Цитировать Сообщить модератору
 Re: Реализация уникальности без ключей и индексов  [new]
НеофитSQL
Member

Откуда: Маями
Сообщений: 760
Вячеслав Любомудров
Красава, че


Спасибо :)

> Только вот наличие в целевой табличке надо проверять тоже уже после получения блокировки
Действительно. Я строил constraint только для вставки, как proof of concept.
Мне было интересно посмотреть, с какими сложностями может столкнуться программист при создании constraint по колонке, и возможно ли это вообще.

> А также обязательно не забыть выполнять всю эту возню и при UPDATE и при DELETE
Конечно, это было оговорено.

> Ну и использование явного номера блокировки -- не есть хорошо
proof of concept

>Про производительность вообще молчу
proof of concept

Я поначалу рассматривал возможность использования структур в памяти (collections or bitmask), но пока не разобрался можно ли их создавать в глобальном контексте.
15 ноя 20, 01:12    [22232238]     Ответить | Цитировать Сообщить модератору
 Re: Реализация уникальности без ключей и индексов  [new]
НеофитSQL
Member

Откуда: Маями
Сообщений: 760
graycode
кит северных морей,

Неофит отказывается изучать и понимать многопользовательский доступ к одному ресурсу, ему почему то кажется, что если он напишет много бредового кода, то законы природы перестанут действовать.


Короткий метод через индекс вспоогательной таблицы не понравился другим, пришлось делать вручную.


Давайте прекратим обсуждение ТС, и посмотрим на суть вопроса: возможно ли средствами Оракла реализовать unique constraint на таблице через триггеры?

Я столкнулся с несколькими проблемами, но решил задачу для insert. Похожим образом она решается для delete, update.

Мне видится, что задача решаема. Для уникальности естественно это упражнение не слишком полезно, т.к. есть встроенные средства.
Для какого-нибудь экзотического constraint по колонке (напр., расстояние Левенштайна между любых двух строк не может быть менее N) мой метод позволяет построить прототип.

Код опубликован, известные ошибки исправлены. Меньше страницы, можно прочитать и найти ошибку.
Попробуйте, серыйкод, обмануть мой триггер как это сделал SY для ранней версии.

А потом подумайте, почему мой интерес в возможности или невозможности задачи вам причиняет неудобство.
15 ноя 20, 01:29    [22232241]     Ответить | Цитировать Сообщить модератору
 Re: Реализация уникальности без ключей и индексов  [new]
кит северных морей
Member

Откуда: krsk / nyc / krsk
Сообщений: 882
НеофитSQL
Для какого-нибудь экзотического constraint по колонке (напр., расстояние Левенштайна между любых двух строк не может быть менее N) мой метод позволяет построить прототип.
обычно проверки со сложной бизнес-логикой реализуются либо как часть API для модификации данных, либо как отдельный процесс data quality. делать это на триггерах интересно в качестве упражнения, но для продуктива много вариантов проще и надёжнее.
15 ноя 20, 07:35    [22232262]     Ответить | Цитировать Сообщить модератору
 Re: Реализация уникальности без ключей и индексов  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
НеофитSQL
SY,
Там нужен не Inf, не гугол а ноль.


Там просто не нужен NVL. Ну а теперь попробуй TRUNCATE TEST23:

SQL> insert into test23 values(1);

1 row created.

SQL> truncate table test23;

Table truncated.

SQL> insert into test23 values(1);
insert into test23 values(1)
            *
ERROR at line 1:
ORA-00001: unique constraint (.) violated
ORA-06512: at "SCOTT.TR_TEST23", line 37
ORA-06512: at "SCOTT.TR_TEST23", line 13
ORA-04088: error during execution of trigger 'SCOTT.TR_TEST23'


SQL>


Но суть не в этом а в том что ты убиваешь транзакционность. При уникальном ключе сессия 2 нарвавшаяся на еще незакоммиченный дубль сессии 1 висит до тех пор пока сессия 1 не выполнит либо commit - тогда сессия 2 получит ORA-00001, либо rollback - тогда insert/update сессии 2 прекрасно завершится. Ты-же бежишь впереди паровоза и выставляешь сессии 2 ORA-00001 когда сессия 1 еще не завершила транзакцию:

Cессия 1:

SQL> insert into test23 values(1);

1 row created.

SQL>


Cессия 2:

SQL> insert into test23 values(1);
insert into test23 values(1)
            *
ERROR at line 1:
ORA-00001: unique constraint (.) violated
ORA-06512: at "SCOTT.TR_TEST23", line 37
ORA-06512: at "SCOTT.TR_TEST23", line 13
ORA-04088: error during execution of trigger 'SCOTT.TR_TEST23'


SQL>


SY.
15 ноя 20, 15:01    [22232362]     Ответить | Цитировать Сообщить модератору
 Re: Реализация уникальности без ключей и индексов  [new]
Кобанчег
Member

Откуда: Рахів
Сообщений: 841
НеофитSQL
Для какого-нибудь экзотического constraint по колонке
Открой для себя user DOMAIN INDEXES.

Любые попытки извернуться через триггер заранее обречены на провал.
Подумай про более чем одного пользователя и про то когда срабатывает триггер - при окончании транзакции или немного раньше.
Всё кроме полной сериализаци нерабочее, а сериализация - бессмысленна.
15 ноя 20, 15:56    [22232383]     Ответить | Цитировать Сообщить модератору
 Re: Реализация уникальности без ключей и индексов  [new]
graycode
Member

Откуда:
Сообщений: 468
НеофитSQL,

  -- check among commited values
  select count(*) into n from dual
   where exists (select 1 from test23 where uq = :new.uq);

Во время выполнения этого запроса, другая сессия выполняет фиксацию транзакции, например ты проверяешь uq = 100500 и другая сессия в этот момент зафиксировала вставку с таким же uq, как ты думаешь, что произойдет дальше?
15 ноя 20, 17:41    [22232408]     Ответить | Цитировать Сообщить модератору
 Re: Реализация уникальности без ключей и индексов  [new]
НеофитSQL
Member

Откуда: Маями
Сообщений: 760
Конструктивные ответы. Я подумаю ещё.

Кабанчег, "обречены на провал" у вас означает невыполнимо в принципе, или "нет смысла, потому что встроенные лучше?"

Про второе я не сомневаюсь. Про первое я пока не уверен, хочу разобраться.

SY: про trunc понял,я начал с реализации только insert, другие операции пока не разрешены. Если невозможно сделать insert, то невозможно вообще.
15 ноя 20, 17:58    [22232410]     Ответить | Цитировать Сообщить модератору
 Re: Реализация уникальности без ключей и индексов  [new]
НеофитSQL
Member

Откуда: Маями
Сообщений: 760
graycode
НеофитSQL,

  -- check among commited values
  select count(*) into n from dual
   where exists (select 1 from test23 where uq = :new.uq);

Во время выполнения этого запроса, другая сессия выполняет фиксацию транзакции, например ты проверяешь uq = 100500 и другая сессия в этот момент зафиксировала вставку с таким же uq, как ты думаешь, что произойдет дальше?


Я думаю что вернёт 0 (зафиксировала это post?), дальше увидит значение во вспомогательной таблице и даст ошибку дупликата.

Кто-то уже посоветовал перенести эту проверку в критическую секцию. Как окончательно проснусь,обновлю код триггера, чтоб не обсуждать ошибки старых версий.
15 ноя 20, 18:03    [22232413]     Ответить | Цитировать Сообщить модератору
 Re: Реализация уникальности без ключей и индексов  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
НеофитSQL

SY: про trunc понял,я начал с реализации только insert, другие операции пока не разрешены. Если невозможно сделать insert, то невозможно вообще.


Забудь про truncate. Реши транзакционность.

SY.
15 ноя 20, 18:06    [22232415]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4 5   вперед  Ctrl      все
Все форумы / Oracle Ответить