powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Реализация уникальности без ключей и индексов
25 сообщений из 104, страница 1 из 5
Реализация уникальности без ключей и индексов
    #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
Реализация уникальности без ключей и индексов
    #40018123
K790
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
жесть какая-то. смешались в кучу кони, scn и ...
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40018127
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заставь дурака богу молиться....
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40018130
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Трава в "Маями" зачетная.
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40018133
Фотография 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
Реализация уникальности без ключей и индексов
    #40018218
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,

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

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

О...

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

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

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

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

Про производительность вообще молчу
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40018241
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров
Красава, че
Неужели ты стал ценить слащавость речей, а не профессионализм? Оно даже не удосужилось протестировать своё %ё&ище...
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40018242
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров
Oracle может сам захотеть использовать этот номер.
С какой стати?
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40018244
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
Вячеслав Любомудров
Красава, че
Неужели ты стал ценить слащавость речей, а не профессионализм? Оно даже не удосужилось протестировать своё %ё&ище...
То, что с профессионализмом пока плохо -- согласен, но это дело наживное...
То, что не хочет читать доку -- это не совсем так, ссылки-то он на доку дает
То, что он пытается перенести аналогии с какого-нибудь 86 ассемблера -- ну оно может и не правильно, но ненаказуемо
А вот то, что чел реально изучает новые вещи (тот же DBMS_LOCK) хотя бы просто для того чтоб натянуть нос его пнувшим -- уже достойно уважения
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40018245
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
Вячеслав Любомудров
Oracle может сам захотеть использовать этот номер.
С какой стати?
Почему бы и нет?
Вызов DBMS_LOCK.ALLOCATE_UNIQUE будет проверять зарегистрирован ли этот lock_id для какого-нибудь имени (из таблички sys.dbms_lock_allocated), и если нет вполне может его прихватизировать
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40018247
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров
Почему бы и нет?
Код: plsql
1.
2.
Rem     Lockids from 2000000000 to 2147483647 are reserved for products
Rem     supplied by Oracle:
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40018249
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров
А вот то, что чел реально изучает новые вещи (тот же DBMS_LOCK) хотя бы просто для того чтоб натянуть нос его пнувшим -- уже дос
Совать что ни попадя куда не попадя чревато несчастными случаями.
В психиатрии таких изолируют и не дискутируют, чтобы не ухудшить их самочувствие.
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #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
Реализация уникальности без ключей и индексов
    #40018251
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
Вячеслав Любомудров
А вот то, что чел реально изучает новые вещи (тот же DBMS_LOCK) хотя бы просто для того чтоб натянуть нос его пнувшим -- уже дос
Совать что ни попадя куда не попадя чревато несчастными случаями.
В психиатрии таких изолируют и не дискутируют, чтобы не ухудшить их самочувствие.
"А что будет если?"
Не верю, что ты так никогда не делал
Просто вменяемые люди это в продакшн не пускают, но как тренировка -- вполне себе помогает в изучении нового
Дык вроде неофит и не говорит, что это надо пускать в продакшн -- просто говорит, что неплохо бы ширше смотреть на вещи, тем более, которые уже много раз поменялись с новыми версиями
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40018253
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров
Elic
пропущено...
Совать что ни попадя куда не попадя чревато несчастными случаями.
В психиатрии таких изолируют и не дискутируют, чтобы не ухудшить их самочувствие.
"А что будет если?"
Не верю, что ты так никогда не делал
Просто вменяемые люди это в продакшн не пускают, но как тренировка -- вполне себе помогает в изучении нового
Дык вроде неофит и не говорит, что это надо пускать в продакшн -- просто говорит, что неплохо бы ширше смотреть на вещи, тем более, которые уже много раз поменялись с новыми версиями


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


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

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

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

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

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

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


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