|
|
|
помощь в проверке данных перед вставкой
|
|||
|---|---|---|---|
|
#18+
Необходима помощь в проверке данных перед вставкой. Никак не могу придумать, как осуществить ее. Существуют таблицы Расписание(Schedule), Учитель(Teacher), Предмет(Subject) и таблица для сопоставления какой учитель ведет предмет(Subteacher(здесь всего три колонки:n_subteacher-первичный ключ, идентификатор и номера учителя и предмета)). Есть связь между таблицами расписание-учитель и предмет, предмет и subteacher, учитель и subteacher. Нужно написать триггер перед вставкой в расписание на то, ведёт ли учитель данный предмет или нет Попыталась написать, но он не срабатывает: CREATE OR REPLACE TRIGGER subteach BEFORE INSERT OR UPDATE ON schedule FOR EACH ROW DECLARE one NUMBER; two NUMBER; BEGIN SELECT a.n_subteacher INTO one FROM subteacher a WHERE a.N_teacher=(select n_teacher from schedule) AND SELECT a.n_subteacher INTO two FROM subteacher a WHERE a.N_subject=(select N_subject from schedule); IF one!=two THEN raise_application_error('Учитель не ведёт предмет'); END IF; END; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2017, 19:33 |
|
||
|
помощь в проверке данных перед вставкой
|
|||
|---|---|---|---|
|
#18+
a.sonnova, Только триггером невозможно обеспечить промежцелкостность в конкурентной среде. Вместо учителя, в таблице расписаний используй ссыль на "сопоставления". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2017, 22:44 |
|
||
|
помощь в проверке данных перед вставкой
|
|||
|---|---|---|---|
|
#18+
a.sonnovaНужно написать триггерRTFM Data Integrity (FAQ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2017, 07:07 |
|
||
|
помощь в проверке данных перед вставкой
|
|||
|---|---|---|---|
|
#18+
a.sonnova, Ох, мне бы такие простые задачки давали на работе... :) 1)Subteacher - плохое название для таблицы связей между учителями и предметами, я подумал сначала, что это какой-то помощник учителя. Лучше бы тогда было сделать что-то типа link_teachers_subjects или teachers_subjects_parity или хотя бы просто teachers_subjects. 2)a.sonnova Попыталась написать, но он не срабатывает: Ну, логично, там мало того, что некорректный синтаксис, так и логика некорректная. Налицо фундаментальное непонимание принципов целостности БД и работы с триггерами :) Где ты обрабатываешь параметры инсерт запроса в теле триггера? Нигде. Получается, что триггер будет вызываться перед выполнением каждого инсерта или апдейта и при этом будет принимать решение о том, разрешать вставлять/обновлять запись или нет на основе данных, которые уже закоммичены в БД, а не на основе данных, которые присланы в качестве аргументов DML операции. 3)В триггере идет попытка получить первичные ключи, сохранить их в переменные one и two, потом проверка на равенство. Это очень странное решение. А если преподаватель ведет несколько предметов? Oracle будет ожидать скалярное значение, придет множество, будет ошибка. 4)Если преподаватель может вести несколько предметов, то надо сделать так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Обрати внимание на :new - это ссылка на запись, которую ты пытаешься вставить/обновить. То, что ты пыталась сделать можно переписать на корректный pl/sql, но я бы такую работу не принял точно, объяснил, почему в пункте 3. Скрипты, которые я использовал для теста: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2017, 12:58 |
|
||
|
помощь в проверке данных перед вставкой
|
|||
|---|---|---|---|
|
#18+
vanequeНалицо фундаментальное непонимание принципов целостности БД и работы с триггерами :)Твой триггер может создавать только иллюзию целостности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2017, 14:37 |
|
||
|
помощь в проверке данных перед вставкой
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop, Вот чем меня всегда "радовал" форум sql.ru, так это изобилием невсебешных экспертов, которые только и могут, что обосрать чужое решение и при этом ничего не предложить в качестве альтернативы. Действительно, зачем... Твое решение - говно. И точка. Я все сказал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2017, 17:28 |
|
||
|
помощь в проверке данных перед вставкой
|
|||
|---|---|---|---|
|
#18+
vaneque, Твою целкостность даже в одно рыло можно поломать - добавить запись в расписание, затем удалить из сопоставлений. Чем FK не устраивает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2017, 18:32 |
|
||
|
помощь в проверке данных перед вставкой
|
|||
|---|---|---|---|
|
#18+
vaneque, Свои фантазии невсебешность, обосрать и говно лучше оставь при себе. До твоего поста уже было дано два толковых ответа и я дал тебе намек, что не взлетит. Если после всего непонятно почему - можно спросить прямо вместо того, чтоб сопли размазывать по форуму. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2017, 18:55 |
|
||
|
помощь в проверке данных перед вставкой
|
|||
|---|---|---|---|
|
#18+
subhumansvaneque, Твою целкостность даже в одно рыло можно поломать - добавить запись в расписание, затем удалить из сопоставлений Вот это уже какой-никакой разговор. "Целкостность" как раз-таки и не даст жизни битым ключам в твоем примере. Все зависит от бизнес-требований. Если условиться, что в сопоставления учителей и предметов данные только добавляются, то проблем не будет. Если преподаватели по какой-то причине перестают читать какие-то предметы, тут уже другой разговор. subhumansЧем FK не устраивает? Так а как FK решит ту же проблему, которую ты обозначил в твоем письме? Разве что если его сделать как enable novalidate ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2017, 18:56 |
|
||
|
помощь в проверке данных перед вставкой
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop, хорошо, извини за резкость. Поясни, пожалуйста, свою мысль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2017, 18:58 |
|
||
|
помощь в проверке данных перед вставкой
|
|||
|---|---|---|---|
|
#18+
vaneque, Выше уже ответили, если вставить в расписание, а потом удалить соответствующую строку из таблицы-развязки, то в расписании будет некорректная (не знаю как точнее перевести с английского - orphaned) запись. Чтоб избежать делаешь развязку родительской таблицей с первичным ключом по двум полям, а расписание - дочерней. PS. Отдельная тема - надо ли в таблице-развязке иметь суррогатный айдишник, это зависит от того как выполняется редактирование, ведется история и прочих деталей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2017, 19:15 |
|
||
|
помощь в проверке данных перед вставкой
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopvaneque, Выше уже ответили, если вставить в расписание, а потом удалить соответствующую строку из таблицы-развязки, то в расписании будет некорректная (не знаю как точнее перевести с английского - orphaned) запись. Чтоб избежать делаешь развязку родительской таблицей с первичным ключом по двум полям, а расписание - дочерней. PS. Отдельная тема - надо ли в таблице-развязке иметь суррогатный айдишник, это зависит от того как выполняется редактирование, ведется история и прочих деталей. Понял теперь. Ну, это я проглядел, да, спасибо :) Просто сконцентрировался в первую очередь на триггере, а не на проектировании схемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2017, 19:55 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39452794&tid=1885944]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
64ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
| others: | 250ms |
| total: | 431ms |

| 0 / 0 |
