|
Строковый триггер от мутирования
|
|||
---|---|---|---|
#18+
Ребята, нужна ваша помощь! Необходимо обойти проблему мутирующей таблицы “mutating table”. Имеются таблицы: Employees (где содержатся сведения о сотрудниках, в частности идентификатор должности и зарплата) и Jobs (где содержатся сведения о должностях, в частности идентификатор должности и минимальная зарплата). Необходимо создать строчный ( не составной ) триггер, который связан с Jobs, который будет вызывать процедуру upd_sal(job_id, salary), если обновится минимальный уровень зарплаты для должности. Варианты ниже не работают: 1) Код: plsql 1. 2. 3. 4. 5. 6. 7.
2) Код: plsql 1. 2. 3. 4. 5. 6.
Я никак не пойму, как создать такой триггер. Помогите, пожалуйста! ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2021, 23:30 |
|
Строковый триггер от мутирования
|
|||
---|---|---|---|
#18+
Stravicki, Триггер надо создавать на Employees зы покажите upd_sal ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2021, 08:41 |
|
Строковый триггер от мутирования
|
|||
---|---|---|---|
#18+
Stax, Требуется создать триггер именно на Jobs. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2021, 10:26 |
|
Строковый триггер от мутирования
|
|||
---|---|---|---|
#18+
Stravicki Stax, Требуется создать триггер именно на Jobs. я не так понял тоесть, в Employees не должно быть сотрудников с ЗП меньше min_sal? не могу придумать где там мутация зы я так понимаю ФК с Employees на Jobs ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2021, 11:45 |
|
Строковый триггер от мутирования
|
|||
---|---|---|---|
#18+
Stax , автортоесть, в Employees не должно быть сотрудников с ЗП меньше min_sal? Да, верно. авторя так понимаю ФК с Employees на Jobs Да. авторне могу придумать где там мутация К таблице Employees есть свой триггер check_salary, который читает Jobs. Плюс, есть check_salary, созданный собственноручно. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2021, 12:03 |
|
Строковый триггер от мутирования
|
|||
---|---|---|---|
#18+
Stravicki К таблице Employees есть свой триггер check_salary, который читает Jobs. Плюс, есть check_salary, созданный собственноручно. тогда обычный обход мутации https://www.sql.ru/faq/faq_topic.aspx?fid=513 в FOR EACH ROW накапливаете данные, в операторном after меняете ЗП зы компаудный я так понял нельзя пользовать pss саму процедуру upd_sal пока не рассматриваем ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2021, 12:41 |
|
Строковый триггер от мутирования
|
|||
---|---|---|---|
#18+
Stax, Важным условием является отсутствие введения дополнительных триггеров. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2021, 12:58 |
|
Строковый триггер от мутирования
|
|||
---|---|---|---|
#18+
С помощью Dynamic SQL сначала деактивируешь триггер на Jobs, потом делаешь update, потом активируешь его обратно. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2021, 13:04 |
|
Строковый триггер от мутирования
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, У меня используются триггеры для заполнения локальной индексированной таблицы до того, как начнется модификация данных. Код: plsql 1. 2. 3. 4. 5.
и Код: plsql 1. 2. 3. 4. 5.
Верно ли понимаю, что надо применить инструкцию Код: plsql 1.
до инициализации и включить триггер после update? Возможно, проблема в том, что инициализация вызывается дважды. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2021, 13:44 |
|
Строковый триггер от мутирования
|
|||
---|---|---|---|
#18+
Там у тебя ещё и пакеты? Суровый зоопарк. Тогда отключать не надо, достаточно в нём проверять флаг-пакетную переменную. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2021, 13:55 |
|
Строковый триггер от мутирования
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, автордостаточно в нём проверять флаг-пакетную переменную Не совсем понимаю, что это. Например, переменная в пакете типа Boolean? Тогда получается надо изменять флаг в init_jobspkg_trg дважды: до и после update. И этот триггер будет составной, либо его можно разбить на два statement-триггера. Есть какие-то варианты, чтобы этот триггер оставался before insert or update statement-триггером? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2021, 14:24 |
|
Строковый триггер от мутирования
|
|||
---|---|---|---|
#18+
Stravicki, Задачу "фтопку". Предположим есть идентификатор должности X с минимальной зарплатой $40,000 в год. И два работника с идентификатором должности X - Вася и Петя. Вася потолковей и его зарплата $45,000 в год. А Петя так себе и его зарплата минимальная $40,000 в год. Теперь пришло ц.у. минимальная зарплата для должности X $45,000 в год. И что теперь? Вася и Петя будут получать одинаково? Так Вася тут-же уйдет. Вообще-то все вопросы зарплаты решаются сугубо индивидуально даже при увеличении минимальной зарплаты ибо хоть и не напрямую это касается всех работников и начальство должно решить а поднять ли Васе зарплату или пусть уходит если не нравится. Второе: как часто меняется минимальная зарплата что это надо автоматизировать да еще через триггер? Третье: даже если "начальство приказало", то "строчный (не составной) триггер" не есть business requirement а есть "создам себе трудности и успешно их преодолею любой ценой". Вообщем дерзай. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2021, 17:02 |
|
Строковый триггер от мутирования
|
|||
---|---|---|---|
#18+
SYТак Вася тут-же уйдет. Куда он из учебной схемы HR уйдёт-то? В схему scott или sys? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2021, 17:17 |
|
Строковый триггер от мутирования
|
|||
---|---|---|---|
#18+
Как партизан на допросе, всё клещами тянуть надо. Изложи ситуацию ПОЛНОСТЬЮ: 1. всё, что есть, 2. всё, что надо 3. почему надо именно так, а не как-то иначе. Утайка информации приравнивается к отсутствию заинтересованности в результате, что влечёт безразличие со стороны отвечающих. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2021, 00:24 |
|
Строковый триггер от мутирования
|
|||
---|---|---|---|
#18+
Правильный Вася Как партизан на допросе, ето явно не лабораторка, уж больно красиво оформлено скорее всего, часть логики из пакета решили перенести в триггер, и нарвались на мутацию .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2021, 08:25 |
|
Строковый триггер от мутирования
|
|||
---|---|---|---|
#18+
Мутация - это, в некотором роде, циклическая зависимость. Для ухода от циклических зависимостей, код разбивается на слои: это когда код верхнего уровня может вызвать код нижнего, но не наоборот. Вариант обхода по ссылке выше - наименее трудозатратный и вполне приемлем в простых случаях. Для упрощения кода в сложных ситуациях (чтобы легче понимать, что происходит), можно применять вариант, когда таблицы оборачиваются вьюхами, и клиенсткий код работает не с таблицами, а именно с вьюхами - во вьюхах можно добавлять и фильтры, и instead-of триггеры. В уже существующей инфраструктуре я такой вариант применял: а) исходные таблицы переименовываются (либо вообще выносятся в отдельную схему) б) создаются вьюхи, имена которых совпадают с предыдущими именами таблиц в) на вьюхах пишутся instead-of триггеры г) ну и гранты (с таблиц убрать, отдать вьюхам). В итоге весь клиентский код, который работал с таблицами, теперь работает с представлениями и его менять не нужно. А со стороны БД код разделился на два слоя, его легче поддерживать, плюс появляется простой способ обхода триггеров на вью - это прямая запись в таблицы (без объявления и переключения туда/сюда всяких флагов). Но это надо знать, как там клиентский код с таблицами работает, может он анализирует оракловый словарь на предмет индексов/констрейнтов и т.п. (что маловероятно). ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2021, 10:30 |
|
Строковый триггер от мутирования
|
|||
---|---|---|---|
#18+
Есть строчный (не составной) AFTER UPDATE триггер на Jobs, который срабатывает после обновления минимальной з/п в Jobs. В этом триггере вызывается процедура на обновление з/п в таблице Employees. Также есть BEFORE триггер (1) для инициализации локальной индексированной таблицы - копии Jobs (процедура инициализации разработана в пакете). На таблицу Employees есть триггер check_salary, в котором вызывается процедура для проверки соответствия з/п диапазону [min_sal;max_sal]. При этом также есть BEFORE триггер (2), вызывающий процедуру инициализации локальной индексированной таблицы для Jobs. Возникает мутация, которая, как я понимаю, связана с тем, что идет обращение к индексированной таблице одновременно и со стороны триггера на Jobs, и со стороны триггера на Employees (но почему?). Для решения этой проблемы я использую булевскую переменную в том самом пакете, где и процедура инициализации. Значение флага устанавливаю в триггере (1), а потом сбрасываю. В триггере (2) проверяю, что он сброшен. При этом, триггер на Jobs приходится переделать из statement BEFORE INSERT OR UPDATE в составной (добавляю раздел AFTER, где сбрасываю значение булевской переменной). Как-то можно избежать этого составного триггера (желательно без добавления новых объектов в БД)? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2021, 13:04 |
|
Строковый триггер от мутирования
|
|||
---|---|---|---|
#18+
Stravicki Возникает мутация, которая, как я понимаю, связана с тем, что идет обращение к индексированной таблице одновременно и со стороны триггера на Jobs, и со стороны триггера на Employees (но почему?). нет "закоментируйте" обращение к jobs из check_salary, и мутация "пропадет" ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2021, 13:43 |
|
Строковый триггер от мутирования
|
|||
---|---|---|---|
#18+
Stax, В check_salary идет обращение не к самой таблице Jobs, а к индексированной таблице. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2021, 13:47 |
|
Строковый триггер от мутирования
|
|||
---|---|---|---|
#18+
Stravicki Stax, В check_salary идет обращение не к самой таблице Jobs, а к индексированной таблице. что такое индексированная таблица? покажите полностью текст ошибки мутации ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2021, 14:04 |
|
Строковый триггер от мутирования
|
|||
---|---|---|---|
#18+
Неужели так сложно выяснить на каком именно операторе возникает ошибка мутации и call stack к нему?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2021, 14:05 |
|
Строковый триггер от мутирования
|
|||
---|---|---|---|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 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.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2021, 15:04 |
|
Строковый триггер от мутирования
|
|||
---|---|---|---|
#18+
SY, Stravicki К таблице Employees есть свой триггер check_salary, который читает Jobs . Плюс, есть check_salary, созданный собственноручно. ps salary = greatest(salary,:new.min_salary) не луче ли вынести во where salary> :new.min_salary? ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2021, 15:21 |
|
Строковый триггер от мутирования
|
|||
---|---|---|---|
#18+
Stax SY, salary = greatest(salary,:new.min_salary) не луче ли вынести во where salary> :new.min_salary? ..... stax Мой пример показывает триггер работает даже если JOB_ID натуральный а не суррогатный ключ и посему учитывает ситуацию когда было изменение MIN_SALARY и/или JOB_ID. Так-что where salary > :new.min_salary не катит. При толковом нормализованном дизайне когда JOB_ID суррогатный ключ, да - greatest не нужен и триггер выглядит так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2021, 17:15 |
|
Строковый триггер от мутирования
|
|||
---|---|---|---|
#18+
К сожалению, это не совсем то, что требуется. Мне бы понять, можно ли как-то при использовании пакетной флаговой переменной обойти использование составного триггера с сохранением всех требуемых типов триггеров. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2021, 23:31 |
|
|
start [/forum/topic.php?fid=52&msg=40068836&tid=1880212]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
154ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 245ms |
total: | 498ms |
0 / 0 |