Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Реализация уникальности без ключей и индексов / 25 сообщений из 104, страница 1 из 5
13.11.2020, 21:14
    #40018121
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация уникальности без ключей и индексов
На правах задачки, предложенной 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.
create table TEST23(uq INTEGER); -- target table
create table TEST_U(id INTEGER); -- helper table

create or replace trigger tr_test23
  before insert on test23  
  for each row
declare
  PRAGMA AUTONOMOUS_TRANSACTION;
  n integer;
  l integer := -1;
begin
  if :new.uq is null then raise VALUE_ERROR; end if; -- better ORA-01400: cannot insert NULL

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

  if n > 0 then raise DUP_VAL_ON_INDEX; end if;

  -- take lock to avoid TOCTOU
  l := dbms_lock.request( 1001234567, dbms_lock.X_MODE );
  if l != 0 then raise TIMEOUT_ON_RESOURCE; end if;

  -- clean helper table from rows older than commited data
  delete from test_u u 
   where u.ora_rowscn <= nvl((select max(t.ora_rowscn) from test23 t),'Inf');
  commit;
   
  -- count matching uncommited values from other sessions
  select count(*) into n from test_u u where u.id = :new.uq;

  if n > 0 then raise DUP_VAL_ON_INDEX; end if;

  -- this will remember uncommited value from this session
  insert into test_u (id) values(:new.uq);
  commit;

  l := dbms_lock.release( 1001234567 );
exception
  when others then
    if l = 0 then l := dbms_lock.release( 1001234567 ); end if;
    raise;
end tr_test23;

...
Рейтинг: 0 / 0
13.11.2020, 21:32
    #40018123
K790
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация уникальности без ключей и индексов
жесть какая-то. смешались в кучу кони, scn и ...
...
Рейтинг: 0 / 0
13.11.2020, 21:51
    #40018127
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация уникальности без ключей и индексов
Заставь дурака богу молиться....
...
Рейтинг: 0 / 0
13.11.2020, 21:54
    #40018130
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация уникальности без ключей и индексов
Трава в "Маями" зачетная.
...
Рейтинг: 0 / 0
13.11.2020, 21:56
    #40018133
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация уникальности без ключей и индексов
НеофитSQL

можно ли реализовать constraint по колонке вручную из триггера.
Вроде можно. Я использовал вспомогательную таблицу для симуляции dirty reads, и SCN для фильтра uncommited изменений.
Пример только для insert, update обрабатывается аналогично.


Ты-бы тестировал свои ваяния:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SQL> insert into test23 select 1 from dual;
insert into test23 select 1 from dual
            *
ERROR at line 1:
ORA-01722: invalid number
ORA-06512: at "SCOTT.TR_TEST23", line 36
ORA-06512: at "SCOTT.TR_TEST23", line 19
ORA-04088: error during execution of trigger 'SCOTT.TR_TEST23'


SQL>



Код: plsql
1.
2.
  delete from test_u u 
   where u.ora_rowscn <= nvl((select max(t.ora_rowscn) from test23 t),'Inf'); -- number vs varchar2



SY.
...
Рейтинг: 0 / 0
14.11.2020, 04:32
    #40018218
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация уникальности без ключей и индексов
SY,

Торопился с последним изменением, допустил ошибку. Замените на гугол, SCN точно меньше гугола.

Я попробовал с трёх разных сессий, надёжно пресекает попытки создать дупликаты до исполнения любого из коммитов.

О...

Или это слишком строгое условие уникальности? Тогда ещё проще.
...
Рейтинг: 0 / 0
14.11.2020, 08:05
    #40018234
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация уникальности без ключей и индексов
Красава, че

Только вот наличие в целевой табличке надо проверять тоже уже после получения блокировки

А также обязательно не забыть выполнять всю эту возню и при UPDATE и при DELETE (проверил ты что запись существует, а она уже удалена, просто не закомичена, обычный ключ бы ждал завершения этой транзакции)

Ну и использование явного номера блокировки -- не есть хорошо, Oracle может сам захотеть использовать этот номер. Чтоб его зарегистрировать за определенным именем необходимо выполнить DBMS_LOCK.ALLOCATE_UNIQUE. но это также вызывает COMMIT -- это тоже надо учитывать

Про производительность вообще молчу
...
Рейтинг: 0 / 0
14.11.2020, 10:00
    #40018241
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация уникальности без ключей и индексов
Вячеслав Любомудров
Красава, че
Неужели ты стал ценить слащавость речей, а не профессионализм? Оно даже не удосужилось протестировать своё %ё&ище...
...
Рейтинг: 0 / 0
14.11.2020, 10:06
    #40018242
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация уникальности без ключей и индексов
Вячеслав Любомудров
Oracle может сам захотеть использовать этот номер.
С какой стати?
...
Рейтинг: 0 / 0
14.11.2020, 10:16
    #40018244
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация уникальности без ключей и индексов
Elic
Вячеслав Любомудров
Красава, че
Неужели ты стал ценить слащавость речей, а не профессионализм? Оно даже не удосужилось протестировать своё %ё&ище...
То, что с профессионализмом пока плохо -- согласен, но это дело наживное...
То, что не хочет читать доку -- это не совсем так, ссылки-то он на доку дает
То, что он пытается перенести аналогии с какого-нибудь 86 ассемблера -- ну оно может и не правильно, но ненаказуемо
А вот то, что чел реально изучает новые вещи (тот же DBMS_LOCK) хотя бы просто для того чтоб натянуть нос его пнувшим -- уже достойно уважения
...
Рейтинг: 0 / 0
14.11.2020, 10:20
    #40018245
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация уникальности без ключей и индексов
Elic
Вячеслав Любомудров
Oracle может сам захотеть использовать этот номер.
С какой стати?
Почему бы и нет?
Вызов DBMS_LOCK.ALLOCATE_UNIQUE будет проверять зарегистрирован ли этот lock_id для какого-нибудь имени (из таблички sys.dbms_lock_allocated), и если нет вполне может его прихватизировать
...
Рейтинг: 0 / 0
14.11.2020, 10:30
    #40018247
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация уникальности без ключей и индексов
Вячеслав Любомудров
Почему бы и нет?
Код: plsql
1.
2.
Rem     Lockids from 2000000000 to 2147483647 are reserved for products
Rem     supplied by Oracle:
...
Рейтинг: 0 / 0
14.11.2020, 10:37
    #40018249
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация уникальности без ключей и индексов
Вячеслав Любомудров
А вот то, что чел реально изучает новые вещи (тот же DBMS_LOCK) хотя бы просто для того чтоб натянуть нос его пнувшим -- уже дос
Совать что ни попадя куда не попадя чревато несчастными случаями.
В психиатрии таких изолируют и не дискутируют, чтобы не ухудшить их самочувствие.
...
Рейтинг: 0 / 0
14.11.2020, 10:46
    #40018250
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация уникальности без ключей и индексов
Elic
Вячеслав Любомудров
Почему бы и нет?
Код: plsql
1.
2.
Rem     Lockids from 2000000000 to 2147483647 are reserved for products
Rem     supplied by Oracle:

Ну, вообще-то я имел ввиду именно диапазон пользовательских блокировокавтор
Код: plaintext
1.
 96.6.1 ALLOCATE_UNIQUE Procedure 
This procedure allocates a unique lock identifier (in the range of 1073741824 to 1999999999) a specified lock name.

Но у него еще хуже: 1001234567
Насколько понимаю, это вполне может пересечься с обычными (DML) блокировками, что вообще плохо
...
Рейтинг: 0 / 0
14.11.2020, 10:51
    #40018251
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация уникальности без ключей и индексов
Elic
Вячеслав Любомудров
А вот то, что чел реально изучает новые вещи (тот же DBMS_LOCK) хотя бы просто для того чтоб натянуть нос его пнувшим -- уже дос
Совать что ни попадя куда не попадя чревато несчастными случаями.
В психиатрии таких изолируют и не дискутируют, чтобы не ухудшить их самочувствие.
"А что будет если?"
Не верю, что ты так никогда не делал
Просто вменяемые люди это в продакшн не пускают, но как тренировка -- вполне себе помогает в изучении нового
Дык вроде неофит и не говорит, что это надо пускать в продакшн -- просто говорит, что неплохо бы ширше смотреть на вещи, тем более, которые уже много раз поменялись с новыми версиями
...
Рейтинг: 0 / 0
14.11.2020, 11:07
    #40018253
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация уникальности без ключей и индексов
Вячеслав Любомудров
Elic
пропущено...
Совать что ни попадя куда не попадя чревато несчастными случаями.
В психиатрии таких изолируют и не дискутируют, чтобы не ухудшить их самочувствие.
"А что будет если?"
Не верю, что ты так никогда не делал
Просто вменяемые люди это в продакшн не пускают, но как тренировка -- вполне себе помогает в изучении нового
Дык вроде неофит и не говорит, что это надо пускать в продакшн -- просто говорит, что неплохо бы ширше смотреть на вещи, тем более, которые уже много раз поменялись с новыми версиями


Вячеслав, в целом согласен, но он к сожалению еще и новичкам советует...
А вот это уже ни в какие ворота не лезет.
...
Рейтинг: 0 / 0
14.11.2020, 11:10
    #40018254
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация уникальности без ключей и индексов
Согласен
Но, например, ответ в Разбиение одного запроса с JOIN на несколько волне себе адекватный (точнее, что пришло на вход, то и получайте на выходе)
С отсылкой к RTFM, прошу заметить
...
Рейтинг: 0 / 0
14.11.2020, 11:56
    #40018265
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация уникальности без ключей и индексов
Вячеслав Любомудров
Насколько понимаю, это вполне может пересечься с обычными (DML) блокировками
Вячеслав, ты о чём?! Они в принципе непересекаемы.
...
Рейтинг: 0 / 0
14.11.2020, 11:57
    #40018266
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация уникальности без ключей и индексов
Вячеслав Любомудров
Согласен
Но, например, ответ в
Редкие проблески сознания не изменяют картины в целом.
...
Рейтинг: 0 / 0
14.11.2020, 12:03
    #40018268
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация уникальности без ключей и индексов
НеофитSQL
На правах задачки, предложенной Stax:


без блокирования ресурса (а так можно вообще лок табле)

.....
stax
...
Рейтинг: 0 / 0
14.11.2020, 12:08
    #40018269
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация уникальности без ключей и индексов
Вячеслав Любомудров
"А что будет если?"
Не верю, что ты так никогда не делал
Может ты и забыл, но я всегда старался приводить легко воспроизводимые доказывающие test-case-ы.
У пациента же, в основном, поток сознания.

Ещё раз: не стоит тратить время, чтобы с ним спорить. Это типичная цель троллей - сожрать уйму чужого в пустую потраченного времени.
...
Рейтинг: 0 / 0
14.11.2020, 12:11
    #40018270
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация уникальности без ключей и индексов
Вячеслав Любомудров
натянуть нос его пнувшим
Кстати. Про пнувших. Ты следил, кто это? - Станислав только ухудшает ситуацию.
...
Рейтинг: 0 / 0
14.11.2020, 12:22
    #40018274
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация уникальности без ключей и индексов
Дык я вроде и не спорю
Но запинывать под шконку молодого и (возможно) перспективного чела, который хоть и хочет все попробовать, но, кстати, весьма адекватно реагирует на критику, это же тоже неправильный подход

А как еще молодым изучать Oracle Database?
Понятное дело -- в первую очередь курс по Концепциям и далее в зависимости от направления -- Administration или Development
Потом, как мне кажется, для обоих очень желательно прочтение двутомника Кайта (пусть он и устарел)
Далее просто знать где искать ответы в документации

Это я так вижу (у меня это насущная тема, собираюсь увольняться, а замены так за 20 лет и не нарисовалось, вот и пытаюсь сформулировать требования к претендентам)

Ну дык у неофита все еще впереди, а что огрызается, так мы тоже не ангелы
...
Рейтинг: 0 / 0
14.11.2020, 12:24
    #40018275
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация уникальности без ключей и индексов
Elic
Вячеслав Любомудров
натянуть нос его пнувшим
Кстати. Про пнувших. Ты следил, кто это? - Станислав только ухудшает ситуацию.
Он в своем праве
И просто не ставит так жестко вопрос: или-или
Или ты настоящий ораклист или заткнись и сопи в тряпочку
...
Рейтинг: 0 / 0
14.11.2020, 12:38
    #40018279
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация уникальности без ключей и индексов
Вячеслав Любомудров
перспективного чела
Ты сам, лично пробовал критически оценивать ту пургу? Или доверяешься нейро-программистским способностям персонажа? "Типо" потому что больше некому?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Реализация уникальности без ключей и индексов / 25 сообщений из 104, страница 1 из 5
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]