|
|
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Помогите пожалуйста решить такую задачку: Создать триггер базы данных, не позволяющий вводить в таблицу ААА более трех однофамильцев, работающих в одном отделе. В случае попытки вставить четвертого однофамильца в отдел должно выводиться на экран соответсвующее сообщение. В таблице уже существуют и заполгненны поля: nom_sotr - номер сотрудника nom_otd - номер отдела name1 - фамилия name2 - имя name3 - отчество city - город zarpl - зарплата заранее спасибо за ответ.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 06:50 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Lom-22Помогите пожалуйста решить такую задачку: Создать триггер базы данных, не позволяющий вводить в таблицу ААА более трех однофамильцев, работающих в одном отделе. В случае попытки вставить четвертого однофамильца в отдел должно выводиться на экран соответсвующее сообщение. В таблице уже существуют и заполгненны поля: nom_sotr - номер сотрудника nom_otd - номер отдела name1 - фамилия name2 - имя name3 - отчество city - город zarpl - зарплата заранее спасибо за ответ....Кажется такое можно сталать триггером after на весь statement ... но не уверен, не писал такого.. попробуй ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 06:57 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Lom-22Помогите пожалуйста решить такую задачку: Такое точно у меня сработало... переделай под свою задачу: create table ttttt (a number) / -- сбой на 3м значении (1,2 - можно а 3 уже нельзя) create or replace trigger trg_ttttt_3a_err after insert or update on ttttt begin for r in (select a,count(*) from ttttt group by a having count(*)>2) loop raise_application_error(-20001,'3j povtor '||to_char(r.a)); end loop; end; / Теперь в таблицку tttt можно затолкать только 2 одинаковых значения но не 3.. Проверил работает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 07:03 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Sxak Lom-22Помогите пожалуйста решить такую задачку: Такое точно у меня сработало... переделай под свою задачу: create table ttttt (a number) Наврал - так нельзя:-( Пусть 3 пользователя вводят одинаковое одновременно и пока не коммитят.. Триггер тогда не ругается (не видит сессии другию пользователей) Потом происходит коммит и триггер начинает ругаться даже на безобидное изменение... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 07:18 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
SxakНаврал - так нельзя:-( Пусть 3 пользователя вводят одинаковое одновременно и пока не коммитят.. Триггер тогда не ругается (не видит сессии другию пользователей) Потом происходит коммит и триггер начинает ругаться даже на безобидное изменение... PS может быть так будет можно если ты создашь индекс по ключевым полям (в твоем случае - отдел и фамилия) тогда может быть при вставке произойдет блокировка нужных блоков етого индекса и вставка одновременно одниъх значений будет невозможна, но тут у меня в голове некоторая каша - произойдет ли реально нужная блокировка не знаю. Но даже если произойдет перед созданием триггера надо будет проверить есть ли уже неправильные записи... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 07:23 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Lom-22Помогите пожалуйста решить такую задачку: Ну и последнее раз уж все молчат про блокировку а делать все и проверять тут времени нет и если блокировка обломается то теоритически возможна еще след схема: 1.триггер before на все - сбрасывает пакетные переменные 2. триггер after for each row - добавляет в PL/SQL таблицу которая есть пакетная переменая (та которая сбрасыватеся триггеров бефоре) ключи 3. триггер after на все - провереят только по ключам в пак переменной - тогда по кр мере лишней ругани не будет если уже есть лишние записи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 07:46 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 08:11 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
можно и так Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 08:22 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Падонакможно и так Не понял твоего поста? Куда ты ему предлагаешь запихнуть такой блок? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 08:24 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
В триггере each row можно поступить проще Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 08:26 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Sxak Падонакможно и так Не понял твоего поста? Куда ты ему предлагаешь запихнуть такой блок? да хоть в табличный триггер ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 08:26 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Ты все-таки сначала попробуй Да и вставляй не по одной строке, а хотя бы по 2 ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 08:27 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровТы все-таки сначала попробуй Да и вставляй не по одной строке, а хотя бы по 2 ;-) это кому? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 08:30 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
ПадонакВ триггере each row можно поступить проще Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 08:32 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Падонак[quot Sxak]дурень, ты со мной письками мерица решыл чтоли? На себя посмотри. Интересно здесь модераторы есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 08:37 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровТы все-таки сначала попробуй Да и вставляй не по одной строке, а хотя бы по 2 ;-) Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 08:38 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
На ходу подметки рвешь Падонак В триггере each row можно поступить проще Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 08:40 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
ПадонакНу-ну А теперь прежде чем дурнями кидаться посмотри то же самое да с тем триггером на каждую строчку который ты писал. Кстати такой же (тот который работетат а не тот что фор ич роу) который ты тут только что написал я тут до тебя запостил.... Не писал ты триггров ето видно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 08:40 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровНа ходу подметки рвешь Так ты предметно пиши, о чем говоришь, я предложил два варианта один (даже два первых) потабличный, другой (третий) построчный так ты о третьем писал или как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 08:42 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Sxak Падонак[quot Sxak]дурень, ты со мной письками мерица решыл чтоли? На себя посмотри. Интересно здесь модераторы есть?Вчера модератор вежливо сделал этой паскуде замечание. Так она и модератора облаяла. Чувствует свою безнаказанность, собака. В этоим форуме модераторов почти не видно - А ЖАЛЬ Такое паскудство надо пресекать на корню - отключением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 08:45 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Падонак Вячеслав ЛюбомудровНа ходу подметки рвешь Так ты предметно пиши, о чем говоришь, я предложил два варианта один (даже два первых) потабличный, другой (третий) построчный так ты о третьем писал или как?Он предметно и написал. И я написал. Попиши триггеры познакомишься с ошибкаим типа "... изменяется триггер ф-ция может не заметить етого...." забыл уже точный текст ошибки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 08:45 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
А заодно побалуйся с табличным триггером в разных сессиях ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 08:46 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровТы все-таки сначала попробуй Да и вставляй не по одной строке, а хотя бы по 2 ;-) Да, с построчным я погорячился. Моя ошибка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 08:49 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Ну чтож, с такими репликами этот топик скорее всего закроют и автору придется начинать новый А жаль, задачка интересная ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 08:51 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровНу чтож, с такими репликами этот топик скорее всего закроют и автору придется начинать новый А жаль, задачка интересная Кстати а по моему вопросу не скажешь ты или Элик? в смысле поможет ли индекс блокировать вставку на другие сессии? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 08:55 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
при вставке одинаковых уникальных значенй в двух сессиях одна будет заблокирована ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 08:59 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Падонакпри вставке одинаковых уникальных значенй в двух сессиях одна будет заблокированаПри чем здесь уникальных? Тут же неуникальные надо... подучись еще маленько прежде чем советы давать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 09:00 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Sxak Падонакпри вставке одинаковых уникальных значенй в двух сессиях одна будет заблокированаПри чем здесь уникальных? Тут же неуникальные надо... подучись еще маленько прежде чем советы давать действительно, ошыбсо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 09:10 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Падонакдействительно, ошыбсоЧто характерно, это наблюдается в 99 случаях из 100. Взрослый уважающий себя человек уже давно бы вспомнил то, чему учили в школе: что нужно сперва думать, а потом открывать рот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 09:21 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Lom-22Помогите пожалуйста решить такую задачку: Создать триггер базы данных, не позволяющий вводить в таблицу ААА ... заранее спасибо за ответ.... Базовая идея тут . Это не триггер, но для некоторых случаев позволяет решить задачку. Кодирование, обход мутаций и обеспечение целостности данных при конкурентном изменении данных в таблице -- это ряд вещей, над которыми приходится задумываться решая эту и подобные ей задачи используя DIY-методы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 09:24 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Интересно, а если сделать через сохранение поля (фамилия в данном случае) в массиве в пакете, и проверять в триггере на таблицу, записи имеющиеся в таблице + в массиве? такое возможно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 09:32 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
ПадонакИнтересно, а если сделать через сохранение поля (фамилия в данном случае) в массиве в пакете, и проверять в триггере на таблицу, записи имеющиеся в таблице + в массиве? такое возможно?Возможно и об етом я тоже писал. Воттолько единственное что ето даст - исчезнет ругань на безобидные изменения а проблема разных сессий останется и об ето м я тут тоже писал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 09:35 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
проблема разных сессий, кажыцо должна при этом уйти? сейчас проблема, что не зафиксированные данные в одной сессии не видны в другой. Сохраняя поле в пакет оно будет видно всем и будет видно, сколько значений пытаются записать. Или я ошибаюс? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 09:38 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Падонак Сохраняя поле в пакет оно будет видно всем и будет видно, сколько значений пытаются записать. Или я ошибаюс?Ошибаешься ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 09:40 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Падонакпроблема разных сессий, кажыцо должна при этом уйти? сейчас проблема, что не зафиксированные данные в одной сессии не видны в другой. Сохраняя поле в пакет оно будет видно всем и будет видно, сколько значений пытаются записать. Или я ошибаюс?Пакетные переменные видны только текущей сессии В принципе, можно намутить с глобальным контекстом Еще как вариант - выставлять пользовательскую блокировку для изменяемой фамилии (dbms_lock), но это жуткая сериализация ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 09:41 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров Падонакпроблема разных сессий, кажыцо должна при этом уйти? сейчас проблема, что не зафиксированные данные в одной сессии не видны в другой. Сохраняя поле в пакет оно будет видно всем и будет видно, сколько значений пытаются записать. Или я ошибаюс?Пакетные переменные видны только текущей сессии не знал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 09:44 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровПакетные переменные видны только текущей сессии В принципе, можно намутить с глобальным контекстом Еще как вариант - выставлять пользовательскую блокировку для изменяемой фамилии (dbms_lock), но это жуткая сериализация хорошо, а если в в триггере, во временную(якобы) таблицу в автономной транзакции вставлять то, что пытаются вставить в таблицу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 09:45 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Падонак хорошо, а если в в триггере, во временную(якобы) таблицу в автономной транзакции вставлять то, что пытаются вставить в таблицу? rollback ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 09:47 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров В принципе, можно намутить с глобальным контекстом Не очень понятно как.... dbms_lock понятно можно, а с глоб контекстом? rollback надо оттянуть переменные назад и ето не единственная проблема. Ругаться на чем? на триггере афтер на предложение? тогда ругань пойдет и на безобидные сессии... на изменение переменных вроде блокировок не бывает так что непонятно как етосделать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 09:49 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Lom-22Помогите пожалуйста решить такую задачку: Создать триггер базы данных, не позволяющий вводить в таблицу ААА более трех однофамильцев, работающих в одном отделе. В случае попытки вставить четвертого однофамильца в отдел должно выводиться на экран соответсвующее сообщение. Тригер будет не базы а табличный задача не такая простая как кажется, решения 1.1 блокировка 1.2 триггере проверяем количество 1.2.1 мона вставлять только по одной строке (тогда проще код) 1.2.2 многострочная вставка код чуть сложнее 1.3 снимаем блокировку по завершению транзакции(вставки) PS мона организовывать по разному ...... Stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 09:50 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровЕще как вариант - выставлять пользовательскую блокировку для изменяемой фамилии (dbms_lock), но это жуткая сериализацияМожно делать select for update для проверяемых однофомильцев. Сессия, желающая проверить ту же фамилию, будет ждать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 09:52 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Может быть автору подойдет немного другой сценарий выполнения, ведь не обязательно для решения данной задачи использовать только триггер, можно воспользоваться очень полезной весчью for update: 1. Блокируем все записи с данной фамилией програмно select family from t where upper('family') = upper('блаблабла') for update nowait; 2. Проверяем сколько у нас выбралось фамилий 3. Вставляем запись либо выдаем предупреждение Конечно может быть у автора нет возмождности модифицировать программу, но тогда скорее всего встанет проблема описанная выше, не буду проверять некогда но предложу еще один вариант, немного некрасивый но может кто модифицирует и найдет более красивое решение 1. создаем дополнительный столбец с чеком, диапазон значений от 1 до 3 и вешаем уникальный констрейнс на фамилию и этот столбец 2 при вставке в триггере вычисляем значения от 1 до 3 в зависимости от фамилии, если значения будут выходить за рамки выдаем ошибку, в 2 разных сессиях тоже не будет вставки так как одна из низ выдаст unique constrains violatide PS to Elic не думал что вы так не любите комаров :) кожа за столь долгое время должна была уже стать потолще:) to Падонак Ты что не можеш понять что тебя либо закроют либо просто удалят этот ник и будут чистить сообщения, правила форума почитай и будь повежливее, а то как то ндоело бред читать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 09:52 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Elic Вячеслав ЛюбомудровЕще как вариант - выставлять пользовательскую блокировку для изменяемой фамилии (dbms_lock), но это жуткая сериализацияМожно делать select for update для проверяемых однофомильцев. Сессия, желающая проверить ту же фамилию, будет ждать.Не совсем. Если только начали вставлять (нет еще однофамильцев) то ждать она ничего не будет и пока не закоммитили можно наделать кучу незакоммиченных сессий с такой же фамилией. Или я ошибаюс?:-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 09:54 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Elic Вячеслав ЛюбомудровЕще как вариант - выставлять пользовательскую блокировку для изменяемой фамилии (dbms_lock), но это жуткая сериализацияМожно делать select for update для проверяемых однофомильцев. Сессия, желающая проверить ту же фамилию, будет ждать.Имелось ввиду и добавляемой и удаляемой - алгоритм Stax расписал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 09:56 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Elic Вячеслав ЛюбомудровЕще как вариант - выставлять пользовательскую блокировку для изменяемой фамилии (dbms_lock), но это жуткая сериализацияМожно делать select for update для проверяемых однофомильцев. Сессия, желающая проверить ту же фамилию, будет ждать. как ты собираешься это делать, если такой фамилии нет и будет сделана многострочная вставка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 09:59 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров Elic Вячеслав ЛюбомудровЕще как вариант - выставлять пользовательскую блокировку для изменяемой фамилии (dbms_lock), но это жуткая сериализацияМожно делать select for update для проверяемых однофомильцев. Сессия, желающая проверить ту же фамилию, будет ждать.Имелось ввиду и добавляемой и удаляемой - алгоритм Stax расписалНу и на обновление фамилии, соответственно, две блокировки - так что сериализация вааще крутая будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:02 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Плюс, при ошибке нужно снять только вновь выставленные блокировки для этого оператора - короче, тихий ужас ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:04 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Vint ... 2 при вставке в триггере вычисляем значения от 1 до 3 в зависимости от фамилии, если значения будут выходить за рамки выдаем ошибку, в 2 разных сессиях тоже не будет вставки так как одна из низ выдаст unique constrains violatide PS Как вычислите номер? ..... Stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:04 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Stax.Как вычислите номер? Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:06 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
создать уникальный fbi индекс, имхо он должен строится построчно но я неуверен что это правильно, не сильно понимаю как отреагирует на обман оракля ..... Stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:07 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Vint Stax.Как вычислите номер? Код: plaintext Уже писали, не увидите незакомиченные попробуйте в нескольких сесиях ...... Stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:09 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Stax. Vint Stax.Как вычислите номер? Код: plaintext Уже писали, не увидите незакомиченные попробуйте в нескольких сесиях ...... Stax Видимо вы просмотрели дополнение о уникальном констрэйнсе на фамилию и доп столбец:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:11 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Stax.создать уникальный fbi индекс, имхо он должен строится построчно но я неуверен что это правильно, не сильно понимаю как отреагирует на обман оракля ..... StaxЧто-то идея не совсем ясна Можно подробней? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:11 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Кстати а чем эта идея то не нравится? Владимир БегунБазовая идея тут . Это не триггер, но для некоторых случаев позволяет решить задачку. Кодирование, обход мутаций и обеспечение целостности данных при конкурентном изменении данных в таблице -- это ряд вещей, над которыми приходится задумываться решая эту и подобные ей задачи используя DIY-методы. Я в принципе перебежчик с 7го оракла не знаю были ли там mater.view по р мере не работал с ними но как я понимаю иде красивая.. По сути получается отлож ограничение до коммита если я правильно понял ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:11 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Vint Видимо вы просмотрели дополнение о уникальном констрэйнсе на фамилию и доп столбец:)delete from t where ... and "доп столбец"=2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:12 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Я могу сделать индекс Но я сразу говорю, что у себя я токое б не внедрял подозреваю что будет слетать Так ради трепа или не надо даже браться? .... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:15 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
VintВидимо вы просмотрели дополнение о уникальном констрэйнсе на фамилию и доп столбец:) нет не просмотрел, доп поле надо заполнить в тригере , вот и спрашиваю как ЗЫ со мной можно и надо на ты ....... Stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:18 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров Vint Видимо вы просмотрели дополнение о уникальном констрэйнсе на фамилию и доп столбец:)delete from t where ... and "доп столбец"=2 да если удалить 2 то 1 и 3 остються, конечно можно вычислять дырку но как то получаеться сложно и громоздко решение, намного проще с блокировками сделать ИМХО ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:21 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
SxakКстати а чем эта идея то не нравится? .... почему не нравится, мож и нравится, но нет у меня знаний насчет снапшотов імхо да и слетать будет сомміт а не інсерт что там флейміть не знаю я єтого ...... Stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:21 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Stax. ЗЫ со мной можно и надо на ты ....... Stax ЗЫ Не надо, и не можно ))), главное в человеке воспитание, вот приличной встрече как нить и определимся, а пока будем с вами обсчаться так ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:22 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров Вячеслав Любомудров Elic Вячеслав ЛюбомудровЕще как вариант - выставлять пользовательскую блокировку для изменяемой фамилии (dbms_lock), но это жуткая сериализацияМожно делать select for update для проверяемых однофомильцев. Сессия, желающая проверить ту же фамилию, будет ждать.Имелось ввиду и добавляемой и удаляемой - алгоритм Stax расписалНу и на обновление фамилии, соответственно, две блокировки - так что сериализация вааще крутая будетСериализация в пределах одной фамилии и к тому же в операторном режиме - imho, совсем не проблема. Другое дело, что это просто не работает в определённых случаях: SxakЕсли только начали вставлять (нет еще однофамильцев) то ждать она ничего не будет и пока не закоммитили можно наделать кучу незакоммиченных сессий с такой же фамилией. Кстати, при помощи dbms_lock вообще нельзя осуществить пофамильную блокировку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:24 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Vint Stax. ЗЫ со мной можно и надо на ты ....... Stax ЗЫ Не надо, и не можно ))), главное в человеке воспитание, вот приличной встрече как нить и определимся, а пока будем с вами обсчаться так )))Тады уж старайся общаться грамотно Меня, например, больше коробит обращение на "вы" (с маленькой буквы), чем на "ты" (без гадостей, естественно ;-)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:24 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров Что-то идея не совсем ясна Можно подробней? мне просто лень создавать, если уже известно что это гиблая идея, то зачем буду мучить (позорится) у меня и так ляпов хватает ведь есть простое имхо правильное решение ps придется попробовать ..... Stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:25 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
ElicКстати, при помощи dbms_lock вообще нельзя осуществить пофамильную блокировку.Почему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:25 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Elic SxakЕсли только начали вставлять (нет еще однофамильцев) то ждать она ничего не будет и пока не закоммитили можно наделать кучу незакоммиченных сессий с такой же фамилией. Кстати, при помощи dbms_lock вообще нельзя осуществить пофамильную блокировку.Стоп. Там по номеру лочится так? А номер то можно задать хеш-фцией от фамилии или я ошибаюсь?:-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:27 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
ElicКстати, при помощи dbms_lock вообще нельзя осуществить пофамильную блокировку. опять незачот ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:30 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Elic Кстати, при помощи dbms_lock вообще нельзя осуществить пофамильную блокировку. Пачему? мона блокировать и по хешу, ну что хеш совпадет, тут вероятнось маленькая, не в космос же летим В моей жизни бывает проще 1 не вставляют пачками в отделе кадров, так что мона забится на одиночный инсерт 2 фамилий этих не так уж и много, это не милионы ...... Stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:34 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Если бы данная проблема просто решалась думаю разработчики oracla предоставили возможность писать селекты в check`ах, это было бы иногда очень полезно. но всегда связанно с проблеммами многопользовательского режима, а в данном случае по моему единого решения нет, и автору придеться выбирать из предложенных и мериться с конкретными недостатками конкретного решения ЗЫ Вячеслав Любомудров Тады уж старайся общаться грамотно Меня, например, больше коробит обращение на "вы" (с маленькой буквы), чем на "ты" (без гадостей, естественно ;-)) Подскажите пожалуйста, а где написано что обращение на Вы в русском языке пишеться с большой буквы(конечно я может быть млохо учился в школе не помню правил ), мне с детсва вдолбили в голову что обрашение к старшим и незнакомым людям всегда на ВЫ, поэтому я и стараюсь обсчаться с участниками форума на ВЫ, очень редко когда достают некоторые отдельно взятые личности перехожу на ты(просто нервничаю и это передаеться в интонациях) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:38 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Sxak ElicКстати, при помощи dbms_lock вообще нельзя осуществить пофамильную блокировку.Стоп. Там по номеру лочится так? А номер то можно задать хеш-фцией от фамилии или я ошибаюсь?:-)Единственный способ получить уникальный номер блокировки - это dbms_lock.allocate_unique, который в триггере использовать нельзя. Все остальные способы не гарантируют отсутствие конфликтов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:40 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Elic Sxak ElicКстати, при помощи dbms_lock вообще нельзя осуществить пофамильную блокировку.Стоп. Там по номеру лочится так? А номер то можно задать хеш-фцией от фамилии или я ошибаюсь?:-)Единственный способ получить уникальный номер блокировки - это dbms_lock.allocate_unique, который в триггере использовать нельзя. Все остальные способы не гарантируют отсутствие конфликтов.А зачем обязателнь оуникальный? Ну будет происходить ожидание не на той фамилии иногда но редко. Разве ето критично? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:42 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
VintПодскажите пожалуйста, а где написано что обращение на Вы в русском языке пишеться с большой буквы(конечно я может быть млохо учился в школе не помню правил ), мне с детсва вдолбили в голову что обрашение к старшим и незнакомым людям всегда на ВЫ, поэтому я и стараюсь обсчаться с участниками форума на ВЫ, очень редко когда достают некоторые отдельно взятые личности перехожу на ты(просто нервничаю и это передаеться в интонациях) http://www.gramota.ru/dic/search.php?word=%E2%FB&lop=x&gorb=x&efr=x&zar=x&ag=x&ab=x&lv=x&pe=x&az=x устроит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:48 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
ElicЕдинственный способ получить уникальный номер блокировки - это dbms_lock.allocate_unique, который в триггере использовать нельзя. Все остальные способы не гарантируют отсутствие конфликтов.Автономная транзакция? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:49 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 10:56 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров http://www.gramota.ru/dic/search.php?word=%E2%FB&lop=x&gorb=x&efr=x&zar=x&ag=x&ab=x&lv=x&pe=x&az=x устроит? Спасибо постараюсь исправиться хотя это и трудно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 11:01 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Sxak ElicЕдинственный способ получить уникальный номер блокировки - это dbms_lock.allocate_unique, который в триггере использовать нельзя. Все остальные способы не гарантируют отсутствие конфликтов.А зачем обязателнь оуникальный? Ну будет происходить ожидание не на той фамилии иногда но редко. Разве ето критично?Дело не в уникальном хэше. Номера блокировок - это очень ценный и ограниченный ресурс, который нельзя использовать как попало. Представь, что некая задача тоже использует пользовательские блокировки в таком же широком диапазоне номеров. И для такой задачи может оказаться крайне критичным напороться на чужую (а не свою) блокировку. Т.е. подсистемы могут пересечься по диапазону используемых номеров блокировок с более катастрофическими последствиями, чем "подумаешь, немножко подождёт". Вячеслав ЛюбомудровАвтономная транзакция?А вот это уже похоже на правду. Выходит, я был не прав. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 11:05 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Для решения задачи можно создать дополнительную таблицу со структурой -отдел -фамилия -число_однофамильцев с первичным ключом на (отдел, фамилия) На исходную таблицу повесить триггер for each row before insert or update or delete begin select ... from доп_таблица where :new.отдел=отдел and ... for update; -- for update для многопользовательской работы if inserting and число_однофамильцев=3 then raise_application_error(...) elsif inserting and число_однофамильцев=0 then insert into доп_таблица ... -- если до commit кто-то еще дернется с insert-ом, то получит отлуп из-за уникальности, что не есть хорошо, т.к. в сумме получается только 2 однофамильца. elsif inserting and число_однофамильцев between 1 and 2 then update доп_таблица set число_однофамильцев+1 where ...; elsif deleting and число_однофамильцев>1 then update доп_таблица set число_однофамильцев-1 where ...; elsif -- дальше писать лень, но идея, думаю, понятна end if; end; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 11:18 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
ElicДело не в уникальном хэше. Номера блокировок - это очень ценный и ограниченный ресурс, который нельзя использовать как попало. Представь, что некая задача тоже использует пользовательские блокировки в таком же широком диапазоне номеров. И для такой задачи может оказаться крайне критичным напороться на чужую (а не свою) блокировку. Т.е. подсистемы могут пересечься по диапазону используемых номеров блокировок с более катастрофическими последствиями, чем "подумаешь, немножко подождёт". Ага похоже на правду а вот интренесно перекрестные блокировки dbms_lockом оракл отлавливает? Если нет то есть риск получить 2 зависшие сессии ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 11:22 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
va_kochnevДля решения задачи можно создать дополнительную таблицу со структурой -отдел -фамилия -число_однофамильцев с первичным ключом на (отдел, фамилия) На исходную таблицу повесить триггер for each row .... select ... from доп_таблица where :new.отдел=отдел and ... for update; -- for update для многопользовательской работы ..... insert into доп_таблица ... -- если до commit кто-то еще дернется с insert-ом, Сдается мне что и ето рискует вызвать ...триггер фция может не заметить етого ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 11:25 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Sxakа вот интренесно перекрестные блокировки dbms_lockом оракл отлавливает? Если нет то есть риск получить 2 зависшие сессииЭти блокировки ничем не "особенней". dbmslock.sql Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 11:50 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Elic Единственный способ получить уникальный номер блокировки - это dbms_lock.allocate_unique, который в триггере использовать нельзя. Все остальные способы не гарантируют отсутствие конфликтов. а нам и не надо уникальный, надо по фалилии ..... Stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 12:07 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Ну вот что у меня получилось (кому не лень потестите, а то я ухожу) - сразу говорю - весьма нагрузит систему Код: plaintext 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. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Код: plaintext и получаем Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 12:08 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
va_kochnevДля решения задачи можно создать дополнительную таблицу со структурой -отдел -фамилия -число_однофамильцев с первичным ключом на (отдел, фамилия) end; Это пожалуй единственное вменяемое решение задачи. Триггер можно и попроще нарисовать, но главное - дополнительная таблица обеспечит необходимые блокировки. Чтобы обойти проблему одновременной вставки первого сотрудника однофамильца, можно использовать автономную транзакцию. Если после update счётчика SQL%rowcount = 0, нужно в автономной транзакции добавить запись с новой фамилией и счётчиком = 0, а затем снова повторить update. Код: plaintext 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. Иногда в БД будут оставаться записи с cnt=0, их время от времени придётся удалять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 12:48 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровНу вот что у меня получилось (кому не лень потестите, а то я ухожу) - сразу говорю - весьма нагрузит систему .... Если грубо нужен обход мутации лично я пишу несколько иначе в операторном before очищаю pl/sql таблицу імхо бокировку надо выставить до проверки (до фор) иначе успеют вставить мона несколько улучшить сам селект select name, count(*) cnt from t1 where name in (таблица) может ето и неправильно но я сначала организовываю цикл по таблице и селект получается для каждой фамилии .... Stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 14:01 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Stax.Если грубо нужен обход мутацииТам нет мутации (по крайней мере, я не смог нарваться) Stax. лично я пишу несколько иначе в операторном before очищаю pl/sql таблицуЭто дополнительный триггер - все равно нужет операторный AFTER для проверки результата и строчный BEFORE для блокировок. Хотя, конечно, дело вкуса Stax.імхо бокировку надо выставить до проверки (до фор) иначе успеют вставитьПроверка по фор чисто для ускорения (там ошибка, кстати), чтоб не дергать лишний раз DBMS_LOCK.ALLOCATE_UNIQUE и DBMS_LOCK.REQUEST. Вставить успеют, только если успеют выставить блокировку, тогда уже мы будем ждать Stax. мона несколько улучшить сам селект select name, count(*) cnt from t1 where name in (таблица) может ето и неправильно но я сначала организовываю цикл по таблице и селект получается для каждой фамилии .... StaxЛогично Теперь об ошибках Неправильно ведется таблица блокировок (всегда перезаписывается первая и единственная): Код: plaintext 1. 2. 3. 4. 5. 6. Функция P1.CLEAR_LOCKS нафинг не нужна, т.к. при сбое оператора освободятся все блокировки выставленные в этом операторе (по крайней мере для RELEASE_ON_COMMIT=>TRUE, этакий мини-роллбэк), но нужно почистить таблицу блокировок (P1.SUBMIT_LOCKS), иначе при commit/rollback блокировки освободятся, а мы будем считать что они установлены Как следствие, нет необходимости хранить handle блокировки, соответствующий имени По большому счету таблицу блокировок можно вообще не вести (соответственно, лишние вызовы DBMS_LOCK.ALLOCATE_UNIQUE и DBMS_LOCK.REQUEST) Триггер, естественно, нужно лепить не на любое обновление, а только при обновлении используемых полей (UPDATE OF name) Наверняка, еще куча ошибок/неоптимальностей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 02:06 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
вот из этого можно что нибудь придумать http://www.dbazine.com/oracle/or-articles/tropashko8 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 07:12 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Да... мучения похоже будут продолжаться долго... Код: plaintext 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. 79. 80. 81. 82. 83. 84. 85. 86. 87. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 07:16 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Да нет, причем тут мучения Просто с MV сушественный недостаток - это "отложенность" проверки до коммита (полчаса вводили, а потом узнали, что так низзя) Хотя может кому и подойдет С блокировками мне больше нравится, т.к. попутно решается и задача найти того, кто держит записи не давая их обновить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 07:21 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровДа нет, причем тут мучения Просто с MV сушественный недостаток - это "отложенность" проверки до коммита (полчаса вводили, а потом узнали, что так низзя) Хотя может кому и подойдет С блокировками мне больше нравится, т.к. попутно решается и задача найти того, кто держит записи не давая их обновить "Пилите, Шура, пилите..." (с) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 07:36 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров Stax.Если грубо нужен обход мутацииТам нет мутации (по крайней мере, я не смог нарваться) Stax. лично я пишу несколько иначе в операторном before очищаю pl/sql таблицуЭто дополнительный триггер - все равно нужет операторный AFTER для проверки результата и строчный BEFORE для блокировок. Хотя, конечно, дело вкуса я не имел ввиду что в коде есть мутациия, просто берется стандартная схема обхода и даписываем проверку на 3 Очищаю в бифоре в основном из-за рестарта оператора, если не очищать, то таблицу заполним два раза Вячеслав Любомудров Stax.імхо бокировку надо выставить до проверки (до фор) иначе успеют вставитьПроверка по фор чисто для ускорения (там ошибка, кстати), чтоб не дергать лишний раз DBMS_LOCK.ALLOCATE_UNIQUE и DBMS_LOCK.REQUEST. Вставить успеют, только если успеют выставить блокировку, тогда уже мы будем ждать Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Вячеслав Любомудров Функция P1.CLEAR_LOCKS нафинг не нужна, т.к. при сбое оператора освободятся все блокировки выставленные в этом операторе (по крайней мере для RELEASE_ON_COMMIT=>TRUE, этакий мини-роллбэк), но нужно почистить таблицу блокировок (P1.SUBMIT_LOCKS), иначе при commit/rollback блокировки освободятся, а мы будем считать что они установлены тут я не понял, ну освободятся и добре, что плохого что блокировки снимаеются в случае ошибки Вячеслав Любомудров По большому счету таблицу блокировок можно вообще не вести (соответственно, лишние вызовы DBMS_LOCK.ALLOCATE_UNIQUE и DBMS_LOCK.REQUEST) я бы вел токо таблицу имен, мона даже с distinct ..... Stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 10:07 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Stax. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. В принципе, поведение, как у уникального ключа - встретилась дублирующая запись (неподтвержденная) - ждем результата блокирующей транзакции В общем, вот такое (приглаженное) получилось - я думаю добавить еще и отдел будет нетрудно Код: plaintext 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. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 10:18 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров Мы их заблокировали при вставке в триггере BEFORE ... FOR EACH ROWS (точнее повесили блокировки на фамилии). И вторая сессия эти фамилии уже не вставит до нашего окончания транзакции. Понял, вот что такое невнимательность, просто я блокировал непосредственно перед проверкой (перед select count(*) ) А еще забыл сразу написать, блокировать желательно отсортировав по какому то критерию, иначе легко получить деадлок PS зря Вы не очищаете таблицу в операторном before, но это так мысли в слух ...... Stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 11:01 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Суть идеи: при редактировании оракл блокирует запись, поэтому я попытался свести операции над фамилией+отделом(tab1) к изменению одной записи в другой таблице(tab2). В tab2 фамилия, отдел - первичный ключ, таким образом любые операции над одной фамилией+отдел встанут "в очередь". Проверил работоспобность при insert,delete и update в одной и разных транзакциях, вроде работает. Сразу предупрежу, не работает с множественными изменениями (ограничения на merge). То есть если за один DML удалить, обновить, создать несколько записей в tab1. Ошибки можно измежать, надо просто усовершенствовать триггер tr_tab1_name3_row. Если есть интерес буду рад поделиться дальше... create table tab1( id number primary key, name varchar2(20), otdel number ) / create table tab2( name varchar2(20) not null, otdel number not null, cnt number default 1 not null ) / CREATE GLOBAL TEMPORARY TABLE tab3 ( name VARCHAR2(20) NOT NULL, otdel NUMBER NOT NULL, action char(1) NOT NULL ) ON COMMIT DELETE ROWS / alter table tab2 add constraint pk_tab2 primary key (name,otdel); CREATE OR REPLACE TRIGGER tr_tab2_name3 AFTER UPDATE OF CNT ON TAB2 FOR EACH ROW begin if :new.cnt>3 then raise_application_error(-20000,'Нарушение целостности ...'); end if; end; / create index ind_name3 on tab1 (name asc,otdel asc) / create or replace trigger tr_tab1_name3_row after insert or update or delete of name,otdel on tab1 for each row begin if INSERTING then insert into tab3(name,otdel,action) values (:new.name,:new.otdel,'I'); elsif UPDATING and (:new.name<>:old.name or :new.otdel<>:old.otdel) then insert into tab3(name,otdel,action) values (:new.name,:new.otdel,'I'); insert into tab3(name,otdel,action) values (:old.name,:old.otdel,'D'); else insert into tab3(name,otdel,action) values (:old.name,:old.otdel,'D'); end if; end; / create or replace trigger tr_tab1_name3_st after insert or update or delete of name,otdel on tab1 begin for r in (select * from tab3) loop dbms_output.put_line(R.name||' '||R.otdel||' '||R.action); end loop; merge into tab2 T2 using (select * from tab3) T3 on (T2.name=T3.name and T2.otdel=T3.otdel) when matched then update set T2.cnt=T2.cnt + decode(T3.action,'D',-1,1) when not matched then insert(name,otdel) values(decode(T3.action,'D',null,T3.name),T3.otdel); delete from tab3; end; / ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 11:13 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
... и еще, в данном примере нет никаких автономных транзакций, ипользования dbms_lock и т.п.. Все операции поиска идут по первичным ключам, должно летать на любых объемах, во всяком случае не тормозить (нет select count(*) from tab group by having - перебор всех записей таблицы - из моего опыта - это подвесит систему при промышленных объемах данных) Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 11:20 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
__LEV__... и еще, в данном примере нет никаких автономных транзакций, ипользования dbms_lock и т.п.. Все операции поиска идут по первичным ключам, должно летать на любых объемах, во всяком случае не тормозить (нет select count(*) from tab group by having - перебор всех записей таблицы - из моего опыта - это подвесит систему при промышленных объемах данных) Спасибо. 1 Если есть индекс(а он у вас есть) то летать будет и вариант с count(*) where name=p_name 2 у вас две дополнительные таблицы а ето нагрузка на систему ввода вывода 3 если заводить другую таблицу то имхо мона обойтись одним триггером for ech row на основной, во второй поставить CHECK (cnt <= 3) (как у Владимира) (непонял зачем так сложно) ..... Stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 12:06 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Да и где-то в логике напутано Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Код: plaintext Вроде все правильно, но после коммита в первой сессии получаем во второй Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 12:11 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Да согласен, наверно можно упростить. По поводу дополнительных таблиц - блокировки (dbms_lock)тоже ведь хранятся в системных таблицах - теже таблицы,та же нагрузка на ввод/вывод. К тому же количество блокировок ограничено (порядок 10^9), боюсь "на всех не хватит". Могу ошибаться,но мне кажется, что без дополнительной таблицы (своей, системной и т.п.) не обойтись. Сами посудите: анализировать текущую таблицу в любом типе триггера(пакете и т.п.) - бесполезно - не видно не подтвержденных транзакций других сессий. Хочешь упорядочить операции - юзай оракл (ключи, юник индексы и т.п.). Мне кажется что ответив на этот вопрос(с доп таблицами), мы определимся в каком направлении копать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 12:52 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Сначала надо решить Lom-22 , характер задачи, насколько критичны блокировки, как часто происходят операции над таблицей, мож у них например запрещено удаление инфы(отдел кадров) мож это редкие операции, тогда вообще мона блокировать напр dual надавно обсуждали если код позволяет, пользовать простой пример Владимира Вариантов много, но главное нужно блокировть "инсерт" ....... Stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 13:38 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Lom-22Помогите пожалуйста решить такую задачку: Создать триггер базы данных, не позволяющий вводить в таблицу ААА более трех однофамильцев, работающих в одном отделе. В общем случае решить эту задачу только средствами сервера Oracle нельзя, так как задача является несколько завуалированной классической задачей эмуляции констрейнтов ч/л, кроме самих констрейнтов. А эта задача не имеет решения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2005, 10:46 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
TRust Lom-22Помогите пожалуйста решить такую задачку: Создать триггер базы данных, не позволяющий вводить в таблицу ААА более трех однофамильцев, работающих в одном отделе. В общем случае решить эту задачу только средствами сервера Oracle нельзя, так как задача является несколько завуалированной классической задачей эмуляции констрейнтов ч/л, кроме самих констрейнтов. А эта задача не имеет решения. Как это не имеет? на триггерах Вячеслав Любомудров показал с доп таблицей __LEV__ через снапшоты Владимир Бегун Выбирайте ...... Stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2005, 11:37 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Интересно, никто не пробовал решить подобную задачу на блокировочнике? На грязном чтении? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2005, 12:00 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
gardenmanИнтересно, никто не пробовал решить подобную задачу на блокировочнике? На грязном чтении? Меня убедили, что в оракле нет грязного чтения Можете привести пример когда есть? ....... Stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2005, 11:57 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
2 Stax Он о другом, посмотри в профиль. Пытается показать что в данной задаче MS SQL круче, поскольку обеспечивает грязное чтение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2005, 12:29 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Данную задачу блокировочники действительно решают получше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2005, 14:37 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Грязное чтение это не решение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2005, 15:01 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
gardenmanДанную задачу блокировочники действительно решают получше. пашутил? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2005, 15:08 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
gardenmanДанную задачу блокировочники действительно решают получше. Дык, уникальные индексы изменяются на блокировках и грязном чтении. Пользуйтесь! Поясню на сценарии. Пусть сессии С1 и С2 добавляют в уникальный индекс одинаковый ключ К. Почучаем вот что: 1. С1 insert К. Ok. 2. С2 insert К. Wait 3. С1 commit 4. С2 ORA-00001: unique constraint violated На шаге 2 С2 "видит", что в индексе присутствует ключ К, который добавила С1, но ещё не завершила транзакцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2005, 15:17 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
mcureenab gardenmanДанную задачу блокировочники действительно решают получше. Дык, уникальные индексы изменяются на блокировках и грязном чтении. Пользуйтесь! Поясню на сценарии. Пусть сессии С1 и С2 добавляют в уникальный индекс одинаковый ключ К. Почучаем вот что: 1. С1 insert К. Ok. 2. С2 insert К. Wait 3. С1 commit 4. С2 ORA-00001: unique constraint violated На шаге 2 С2 "видит", что в индексе присутствует ключ К, который добавила С1, но ещё не завершила транзакцию. Нужен пример индекса, какой создаете? ...... Stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2005, 15:38 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Stax. mcureenab gardenmanДанную задачу блокировочники действительно решают получше. Дык, уникальные индексы изменяются на блокировках и грязном чтении. Пользуйтесь! Поясню на сценарии. Пусть сессии С1 и С2 добавляют в уникальный индекс одинаковый ключ К. Почучаем вот что: 1. С1 insert К. Ok. 2. С2 insert К. Wait 3. С1 commit 4. С2 ORA-00001: unique constraint violated На шаге 2 С2 "видит", что в индексе присутствует ключ К, который добавила С1, но ещё не завершила транзакцию. Нужен пример индекса, какой создаете? ...... Stax create unique index ... Ещё добавлю, что статистика Current Gets это ничто иное, как чтения текущих состояний блоков, т.е. состояний которые могут включать изменения созданые незавершёнными транзакциями. Статистика Consistent Gets это чтения блоков по состоянию на определённый момет времени, которые включают изменения только из завершенных к этому моменту времени транзакций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2005, 16:05 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
mcureenabcreate unique index ... Звиняйте, не точно задал вопрос, интересует как укажите по чем индекс, если грубо то по каких полях? ....... Stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2005, 16:15 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Поскольку в задече речь идёт о триггере, то может быть не в тему. добавляем колонку: num integer; -- Номер записи с одинаковым dept и name. создаём ограничение целостности check(num between 1 and 3) -- замечу, что тип колонки integer, тоже содержит неявное ограничение, т.е. мы не можем сохранить, например 1.3. создаём ограничение целостности unique (dept, name, num) теперь в таблицу с колонками (dept, name, num) можно вставить не более трёх записей с одинаковым значением (dept, name). Как вычислить в триггере значение num, это уже другой вопрос. Один из вариантов, использовать дополнительную таблицу со счётчиком уже обсуждался тут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2005, 16:17 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
mcureenabКак вычислить в триггере значение num, это уже другой вопрос Это не другой, а главный вопрос, имхо, пронумеровать не так просто ...... Stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2005, 16:54 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Stax. mcureenabКак вычислить в триггере значение num, это уже другой вопрос Это не другой, а главный вопрос, имхо, пронумеровать не так просто ...... Stax Во истину, мы не ищем лёгких путей! Неужели от 1 до 3х посчитать так сложно? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Это конечно не триггерный вариант и далеко не самый оптимальный, но он тоже работает. Придумать бы, чтобы одновременно три сессии могли скоординированно получить уникальные значения num и не мешая друг другу произвести вставку... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2005, 17:33 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
mcureenab Stax. mcureenabКак вычислить в триггере значение num, это уже другой вопрос Это не другой, а главный вопрос, имхо, пронумеровать не так просто ...... Stax Во истину, мы не ищем лёгких путей! Неужели от 1 до 3х посчитать так сложно? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Это конечно не триггерный вариант и далеко не самый оптимальный, но он тоже работает. Придумать бы, чтобы одновременно три сессии могли скоординированно получить уникальные значения num и не мешая друг другу произвести вставку... мне нравится последний абзац, мне лично придумать сложно ...... Stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2005, 20:04 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
А вот кому решение без триггера! Чистый FBI! Elic, мой приз еще здесь? К сожалению, "скоординировать" три сессии и мне не удалось, хотя... думаю, если хорошо извратить сущность dbms_lock, то все у нас получится :) Код: plaintext 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. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2005, 21:11 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousА вот кому решение без триггера! Чистый FBI! Elic, мой приз еще здесь? I do not think you can claim it. Your FBI is not deterministic: Код: plaintext 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. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2005, 22:03 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Почему-то не заметил раньше этой ветки. ;( Мои несколько копеек: Задача интересная. Хотя само бизнес-правило "не иметь более n однофамильцев в одном отделе" несколько странное. Неужели, где-то это в реальности практикуется? И что делают, если появляется n+1-ый однофамилец? Его в другой отдел переводят? А как быть, если в каждом отделе уже работает n Ивановых и приходит еще один Иванов? Новый отдел создается??? ;) Тем не менее, если не задумываться над странностями бизнес-правила, -- наилучший вариант, имхо, предложил Владимир Бегун. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2005, 22:40 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Well, somehow nobody offered INSTEAD OF trigger solution: Код: plaintext 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. where WHO_CALLED_ME is a function that reads dbms_utility.format_call_stack and retrurns calling routine name (I believe you can find source code у Кайта). SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 00:05 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
SY andrey_anonymousА вот кому решение без триггера! Чистый FBI! Elic, мой приз еще здесь? I do not think you can claim it. Your FBI is not deterministic: SY.Ну не так уж все и плохо. Просто забыл про rebuild Добавьте в ane_test_p.f следующий кусок и все заработает: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 00:16 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Sorry, I hit "post it" too early. There is a caveat. Trigger based solution, applies to future changes only (changes since trigger create time), while index applies to current data + future data. Another word, if we will create table AAA, populate it with, lets say, 5 Joe Shmoe's in department 8, and only then create view and triggers, it will not be detected. It could be considered as a disadvantage or as an advantage since it allows to implement "from now on no more более трех однофамильцев, работающих в одном отделе" rule. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 00:28 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous Ну не так уж все и плохо I think it is worse than you think. Just add dbms_output to deleting part: Код: plaintext 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. As you can see FBI values for each of three rows will be: Код: plaintext 1. 2. Now lets delete row with 1/#/Q!Q/#/2: Код: plaintext 1. 2. 3. 4. 5. 6. As you can see your function wll delete wrong FBI entry 1/#/Q!Q/#/3. So index becomes logically corrupt. You can probably get away with it, since you can not use this FBI in WHERE clause anyway, but still corrupt index is a corrupt index. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 00:52 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Actually, I overlooked a major issue with your solution. It simply will not work. Assume session A inserts a row (for simplicity lets say table is empty). That row will have index value of 1/#/Q!Q/#/1. Session A does not commit/rollback yet. Now session B tries to insert a row. Obviously, table is locked and session B waits. Now the fun part - read consistency. Since session B transaction started before Session A committed, session B will not see any changes done by session A. So when session A will commit and release the lock, session B will also try to insert index value 1/#/Q!Q/#/1 and will get unique constraint violation. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 01:12 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
:-) Код: plaintext 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. 79. 80. 81. 82. 83. Let me repeat: "Кодирование, обход мутаций и обеспечение целостности данных при конкурентном изменении данных в таблице -- это ряд вещей, над которыми приходится задумываться решая эту и подобные ей задачи используя DIY-методы." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 01:34 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
И поделом мне. Классический случай который я только-что описал для andrey_anonymous. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 01:53 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
SYИ поделом мне. Классический случай который я только-что описал для andrey_anonymous. SY. Бывает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 01:56 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
SY ..... CREATE OR REPLACE TRIGGER BIUR_AAA_VIEW INSTEAD OF INSERT OR UPDATE ON AAA_VIEW FOR EACH ROW DECLARE v_cnt NUMBER; BEGIN SELECT COUNT(*) INTO v_cnt FROM AAA WHERE LAST_NAME = :NEW.LAST_NAME AND DEPARTMENT = :NEW.DEPARTMENT; -- -- а в это время в другой сессии тож вставили две записи :) -- IF v_cnt >= 3 .... [/src] SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 10:36 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
SYActually, I overlooked a major issue with your solution. It simply will not work. Assume session A inserts a row (for simplicity lets say table is empty). That row will have index value of 1/#/Q!Q/#/1. Session A does not commit/rollback yet. Now session B tries to insert a row. Obviously, table is locked and session B waits. Now the fun part - read consistency. Since session B transaction started before Session A committed, session B will not see any changes done by session A. So when session A will commit and release the lock, session B will also try to insert index value 1/#/Q!Q/#/1 and will get unique constraint violation. SY. "and will get unique constraint violation". Тем не менее ограничение целостности выполняется, хотя в случае конкурентного доступа может возникать ложная тревога. Получив данную ошибку нужно ещё два раза повторить попытку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 10:39 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
__LEV__Да согласен, наверно можно упростить. По поводу дополнительных таблиц - блокировки (dbms_lock)тоже ведь хранятся в системных таблицах - теже таблицы,та же нагрузка на ввод/вывод. К тому же количество блокировок ограничено (порядок 10^9), боюсь "на всех не хватит". Могу ошибаться,но мне кажется, что без дополнительной таблицы (своей, системной и т.п.) не обойтись. Сами посудите: анализировать текущую таблицу в любом типе триггера(пакете и т.п.) - бесполезно - не видно не подтвержденных транзакций других сессий. Хочешь упорядочить операции - юзай оракл (ключи, юник индексы и т.п.). Мне кажется что ответив на этот вопрос(с доп таблицами), мы определимся в каком направлении копать. Я всегда думал, что пользовательские блокировки размещаются в оперативной памяти, более того, количество одновременно существующих блокировок далеко не 10^9, оно не превышает ENQUEUE_RESOURCES. При чём надо обратить внимание, что оркл вычисляет ENQUEUE_RESOURCES по умолчанию исходя из того, что пользовательских блокировок не будет. При использовании пользовательских блокировок значение этого параметра нужно увеличивать вручную. У меня с пользовательскими блокировками был случай. Когда параметры DML_LOCKS и ENQUEUE_RESOURCES оказались несогласованными при выделении большого числа пользовательских блокировок падал фоновый процесс сервера, ему не хватало очередизируемых ресурсов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 11:11 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Ещё вот такой вариант. Основан на использовании дополнительной таблицы с номерами однофамильцев. Триггер автоматически назначает свободный номер, который не занят незавершенными транзакциями. Если все номера заняты, ждёт освобождения одного из них и повторяет попытку. Если свободных номеров нет совсем, поднимается dup_val_on_index. Два триггера нужны для того, чтобы правильно отрабатывать ожидание и удаление 0 строк. Обновление 0 строк работает не совсем корректно, в том плане что ругается на нарушение уникальности, тогда как обновлять уже нечего. Код: plaintext 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. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 13:48 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
SYActually, I overlooked a major issue with your solution. It simply will not work. Assume session A inserts a row (for simplicity lets say table is empty). That row will have index value of 1/#/Q!Q/#/1. Session A does not commit/rollback yet. Now session B tries to insert a row. Obviously, table is locked and session B waits. Now the fun part - read consistency. Since session B transaction started before Session A committed, session B will not see any changes done by session A. So when session A will commit and release the lock, session B will also try to insert index value 1/#/Q!Q/#/1 and will get unique constraint violation. SY.Описанное Вами поведение имеет место быть, но... Как ни странно, это поведение присуще почти всем приведенным реализациям в той или иной форме, а именно: мы должны каким-либо образом "скоординировать" усилия _всех транзакций, производящих изменения, с точки зрения обеспечения уникальности "троичного" :) ключа. В предложенной реализации FBI я не стал этим заниматься, о чем сразу честно написал. При этом следует сразу отметить, что если таковая синхронизация технически возможна (в чем я почти не сомневаюсь), то ничто не мешает добавить ее в решение на FBI. НО, повторюсь, эта проблема в той или иной форме присуща _всем приведенным _работающим решениям. Теперь про "разрушенный" индекс. Обсуждаемое решение предназначено для обеспечения целостности. Оно изначально не предназначалось для обеспечения _поиска. Поэтому данная критика, хотя и справедлива, не имеет практического значения. Для DML-операций FBI реализует что-то вроде "стека" индексных ключей, чем и обеспечивает целостность. Я пока не нашел сценария, в котором "порушенные" ROWID помешают выполнению основной задачи. Попробую резюмировать: - оно работает - оно НЕ deterministic, и это надо четко понимать (dbms_output я включил специально дабы можно было понаблюдать за этим забавным процессом) - оно решает вполне конкретную задачу без претензий на "универсальность" - оно представляется надежнее "триггерных" решений, поскольку: как справедливо было отмечено, проверит целостность существующих данных уже при создании индекса. может либо работать целиком, либо не работать вообще (триггера, например, могут быть отключены по одному и включены обратно с предсказуемыми последствиями в виде сложно проверяемой нарушенной целостности данных) ВАЖНОЕ ЗАМЕЧАНИЕ : "добавочный" кусок кода - обязательная часть решения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 15:35 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous Попробую резюмировать: - оно работает Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 16:16 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Stax. andrey_anonymous Попробую резюмировать: - оно работает Код: plaintext 1. 2. 3. 4. 5. Можно весь сценарий? И еще один момент - Вы "патчик" прикрутили? (иначе будут проблемы со сценариями, включающими rebuild индекса) =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 17:43 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous Stax. andrey_anonymous Попробую резюмировать: - оно работает Код: plaintext 1. 2. 3. 4. 5. Можно весь сценарий? И еще один момент - Вы "патчик" прикрутили? (иначе будут проблемы со сценариями, включающими rebuild индекса) =) патчык не прыкручивал, токо инсерт и делете, правда я поле ID добавил в таблицу, мне так удобнее, счас удалю все и постараюсь поторить, или мона с Код: plaintext 1. 2. 3. 4. ........ Stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 18:17 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Stax.жду ответа? Ладно пересоздал Код: plaintext 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. Вторая сессия Код: plaintext 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. ....... Stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 18:59 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Stax.жду ответа? Млин, ну ведь терзали же душу смутные сомнения когда я решал - "взрывать" при переполнении или возвращать дублирующий ключ. Бага. Все строки Код: plaintext Код: plaintext - сессия1: delete все вхождения для заданного nom_otd, Name1 - сессия2: insert с переполнением для nom_otd, Name1 (висит, ждет) - сессия1: commit - сессия2: _диагностировано переполнение, но запись вставляется, поскольку "гарантированно дублированный ключ" .../#/1 только что удален. Индекс порушен. Но к ROWID это не имеет никакого отношения. Если при обнаружении переполнении просто рвать - все стастается. Вариант - иметь технологическую запись и в качестве "дублирующего" возвращать "технологический" ключ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 20:23 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
[quot andrey_anonymousЕсли при обнаружении переполнении просто рвать - все стастается.[/quot] Не срастается :( Да, приведенный алгоритм организации "стека" ущербен. 1: insert 1: insert 1: commit; 1: delete all 2: insert 1: commit; 2: commit; тоже приведет к нарушению структуры индекса, поскольку последующий delete будут удалять ключ /#/1, а индексе останется /#/3 :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 20:41 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous[quot andrey_anonymousЕсли при обнаружении переполнении просто рвать - все стастается. Не срастается :( [/quot] во-во я тож пробовал fbi но на мутацию нарвался, а автономная не видит даже себя ..... Stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 21:04 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Stax.во-во я тож пробовал fbi но на мутацию нарвался, а автономная не видит даже себя ..... StaxЯ этого так не оставлю Задача ставится так: необходимо обеспечить алгоритм формирования индексных ключей такой, что: 1. ключи различны для трех идентичных вхождений (nom_otd, name1). 2. ключ не должен формироваться для четвертого и последующих идентичных вхождений (nom_otd, name1). 3. ключ должен непротиворечиво вычисляться в операциях удаления и вставки узлов индекса. Собственно, задача - алгоритмическая. Цимус только в решении без привлечения "посторонних" табличек. Нужен дешевый способ проверки существования узла индекса с заданным ключем. Тогда delete сможет "пробовать" предполагаемые к удалению ключи, а insert - отыскивать возможные "дырки" и не давать ложных срабатываний. Можно было бы посмотреть в сторону indextype, но это неспортивно и не позволит оставить за собой приз ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 21:21 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Подниму-ка... (искал материал по теме truncate vs alter table move вот и наткнулся :) ) Задачка интересная. Все сказанное ИМХО. Решение можно найти только тремя путями: (1) +доп таблица, (2) +доп колонка и (3) задействовать AQ. Что касается третьего, то все более-менее прозрачно, но уж очень хитро. А вот 1 и 2 -- близнецы, только 2-й путь более корявый. Итак, способ с доп таблицей. Код: plaintext 1. 2. 3. 4. 5. 6. Оговариваем особо -- все действия по записи в таблицу делать только через наш пакет: insert, move, rename, delete (вставка работника, перемещение меж отделами, смена фамилии, увольнение). Самый простой алгоритм -- для вставки. 0. savepoint lock_begin 1. Делаем insert в таблицу lock2 номера отдела и фамилии 2. Считаем количество однофамильцев в отделе 2.1. Если уже есть три -- rollback до lock_begin и нафик. 2.2. Иначе вставляем в таблицу полноценную запись 3. выполняем delete from lock2 строки с номером отдела и фамилией. 4. commit В случае переименования или перемещения -- в lock2 пишем две строки. Лучше за один раз, что бы избежать потенциального deadlock (соседняя сессия, к примеру, синхронно вставляет те же две строки, но в обратном порядке) Удаление -- ну тут как скажут, либо удаляем просто, либо помечаем как уволенного (к слову, у нас ОК не удаляет, employee_id уже за 50К перевалило) Предложенный способ должен кмк работать в любых случаях -- мы пользуемся стандартными локингами БД, второй инсерт в lock2 с теми же отделом и фамилией просто будет ждать окончательного коммита первого. При чем не мешая работе с другими парами. Алгоритм, надеюсь, понятен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2006, 18:39 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Затык а том, что корректная проверка условия может быть осуществлена только при коммите. Два пути решения: 1. Было у Tom Kyte несколько раз, например тут Строится MV refresh on commit в котором считается число однофамильцев, а на MV создается check constraint. 2. Было в старом Oracle Magazine. В основной таблице создается дополнительная колонка с числом однофамильцев, поддерживается триггерами. На ней висит deferred constaraint, который при коммите проверяет, чтобы однофамильцев было не больше 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2006, 19:30 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Sergei.AgalakovЗатык а том, что корректная проверка условия может быть осуществлена только при коммите. Сергей, изюминка в том, что в моем способе получается, что с конкретной парой Отдел-Фамилия работает строго один процесс, остальные с такой же парой ждут. Если пара другая -- "мы друг другу не мешаем". =Максим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 14:58 |
|
||
|
Задачка
|
|||
|---|---|---|---|
|
#18+
Офф. забавный термин: "стандартные локинги БД" хочется добавить: лэтчинги, коммитинги, процедуринги ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 15:35 |
|
||
|
|

start [/forum/topic.php?all=1&fid=52&tid=1956403]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
137ms |
get tp. blocked users: |
1ms |
| others: | 212ms |
| total: | 424ms |

| 0 / 0 |
