|
|
|
Ссылочная целостность триггерами
|
|||
|---|---|---|---|
|
#18+
Что-то давным давно читал, что сабж - плохо, и всячески избегал так делать. Но если всё-таки нужно, например надо сделать "foreign key" на 2 и более таблиц - какие могут быть подводные грабли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2011, 22:49 |
|
||
|
Ссылочная целостность триггерами
|
|||
|---|---|---|---|
|
#18+
Kyubeeкакие могут быть подводные грабли? Ничего особенного: просто будут появляться записи, эту самую целостность нарушающие. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2011, 23:13 |
|
||
|
Ссылочная целостность триггерами
|
|||
|---|---|---|---|
|
#18+
Kyubee например надо сделать "foreign key" на 2 и более таблицЭто как? Значение в поле может быть только из этой или той таблицы, ну или вон той, так? В таком случае добавляют несколько полей каждая со своим ограничением внешнего ключа и ограничение на строку что только одно из полей должно содержать непустое значение. Триггеры, в отличие от ограничения внешнего ключа, не проверяют все имеющиеся записи, то есть включение триггера не гарантирует, что все записи прошли проверку. Вообще, использование триггеров в приложении, это как повесить провод "соплей" - быстро, дешево и сердито, но неаккуратненько как-то (с). Ну и плюс производительность обычно страдает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2011, 23:41 |
|
||
|
Ссылочная целостность триггерами
|
|||
|---|---|---|---|
|
#18+
KyubeeЧто-то давным давно читал, что сабж - плохо, и всячески избегал так делать. Но если всё-таки нужно, например надо сделать "foreign key" на 2 и более таблиц - какие могут быть подводные грабли? Триггер сложнее, соответствено, больше вероятность ошибок. А для контроля целостности чем надёжнее, тем лучьше. Ну и чем сложнее логика, тем больше просадка производительности (хотя это может быть неважно). А так, в принципе, просто разная физическая реализация одного и того-же. KyubeeНо если всё-таки нужно, например надо сделать "foreign key" на 2 и более таблицМожно и обычными FK сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2011, 00:03 |
|
||
|
Ссылочная целостность триггерами
|
|||
|---|---|---|---|
|
#18+
SERG1257>несколько полей каждая со своим ограничением внешнего ключа 1) так уже делается, полей плодится всё больше, управляться с ними всё сложнее 2) таблица может быть из другой базы Речь про mssql, триггера можно делать не на скрипте а на c# и соответственно ни в чём себе не отказывать насчёт сложности логики. alexeyvg>просто разная физическая реализация Описано ли где-нибудь как это реализовано внутри у sql-серверов? Какие-нибудь невидимые системные триггеры? Dimitry Sibiryakov>Ничего особенного: просто будут появляться записи, эту самую целостность нарушающие. Если просто - значит можно это как-то смоделировать? Смутно помню, была статья с примером как 2 конкурирующие транзакции в случае с триггерами приводили к ошибке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2011, 11:55 |
|
||
|
Ссылочная целостность триггерами
|
|||
|---|---|---|---|
|
#18+
KyubeeЕсли просто - значит можно это как-то смоделировать? Стартовать транзакцию, удалить запись в главной таблице, не коммитить. Стартовать вторую транзакцию, добавить запись в подчинённую со ссылкой на эту запись, закоммитить. Закоммитить первую транзакцию. Всё, телемаркет - дочерняя запись ссылается в ничто. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2011, 12:36 |
|
||
|
Ссылочная целостность триггерами
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovСтартовать транзакцию, удалить запись в главной таблице, не коммитить. Стартовать вторую транзакцию, добавить запись в подчинённую со ссылкой на эту запись, после этого 2я встаёт на блокировку, её не закоммитить пока не завершится 1я ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2011, 14:39 |
|
||
|
Ссылочная целостность триггерами
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovKyubeeкакие могут быть подводные грабли? Ничего особенного: просто будут появляться записи, эту самую целостность нарушающие. подобные грабли возникают только если вы их специально реализовываете. осознанно или нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2011, 15:22 |
|
||
|
Ссылочная целостность триггерами
|
|||
|---|---|---|---|
|
#18+
Kyubeeпосле этого 2я встаёт на блокировку, её не закоммитить пока не завершится 1я С чего бы это вдруг? Во-первых, FK нет, с точки зрения сервера эти таблицы никак не связаны. А во-вторых, MS SQL перестал быть блокировочником ещё пять лет назад, теперь читатели не тормозят на писателях Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2011, 15:37 |
|
||
|
Ссылочная целостность триггерами
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Провёл эксперимент. База: Код: 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. Запросы, гоняем по одной строчке в разных коннектах: Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2011, 16:18 |
|
||
|
Ссылочная целостность триггерами
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovKyubeeпосле этого 2я встаёт на блокировку, её не закоммитить пока не завершится 1я С чего бы это вдруг? Во-первых, FK нет, с точки зрения сервера эти таблицы никак не связаны. А во-вторых, MS SQL перестал быть блокировочником ещё пять лет назад, теперь читатели не тормозят на писателях хелп про уровни изоляции почитайте для общего развития. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2011, 17:51 |
|
||
|
Ссылочная целостность триггерами
|
|||
|---|---|---|---|
|
#18+
Kyubeealexeyvg>просто разная физическая реализация Описано ли где-нибудь как это реализовано внутри у sql-серверов? Какие-нибудь невидимые системные триггеры?Ну разумеется. Любой констрейн реализуется неким скрытым системным триггером на какие то события, как же ещё? Dimitry SibiryakovKyubeeЕсли просто - значит можно это как-то смоделировать? Стартовать транзакцию, удалить запись в главной таблице, не коммитить. Стартовать вторую транзакцию, добавить запись в подчинённую со ссылкой на эту запись, закоммитить. Закоммитить первую транзакцию. Всё, телемаркет - дочерняя запись ссылается в ничто. Нужно просто правильно писать. Согласитесь, тот код, который реализует нативные ФК в СУБД, не допускает такого? А ведь писали его такие же люди, аткими же руками :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2011, 17:59 |
|
||
|
Ссылочная целостность триггерами
|
|||
|---|---|---|---|
|
#18+
alexeyvgСогласитесь, тот код, который реализует нативные ФК в СУБД, не допускает такого? А ведь писали его такие же люди, аткими же руками :-) Да, но этот код имеет доступ к таким вещам как Dirty Read. У пользовательских триггеров его нет, так что триггер, сработавший в транзакции с TIL snapshot будет отлично видеть родительскую запись такой, какой она была на момент старта транзакции. То бишь - неудалённой. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2011, 18:45 |
|
||
|
Ссылочная целостность триггерами
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovДа, но этот код имеет доступ к таким вещам как Dirty Read.В смысле, код, реализующий FK, использует грязное чтение при проверке ограничений? Что то я сомневаюсь. Dimitry SibiryakovУ пользовательских триггеров его нет, так что триггер, сработавший в транзакции с TIL snapshot будет отлично видеть родительскую запись такой, какой она была на момент старта транзакции. То бишь - неудалённой.Так надо при написании триггера использовать нужные блокировки. По моему, для этого нет никаких препятствий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2011, 00:07 |
|
||
|
Ссылочная целостность триггерами
|
|||
|---|---|---|---|
|
#18+
alexeyvgВ смысле, код, реализующий FK, использует грязное чтение при проверке ограничений? Что то я сомневаюсь. Сомневаться - почётная обязанность каждого мыслящего человека. alexeyvgнадо при написании триггера использовать нужные блокировки. Да? И какие блокировки тут нужны? Эксклюзив на всю мастер-таблицу при добавлении детали? Или эксклюзив на всю деталь при удалении мастера? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2011, 00:16 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37513053&tid=1541959]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
214ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 257ms |
| total: | 554ms |

| 0 / 0 |
