|
Каскадное удаление данных
|
|||
---|---|---|---|
#18+
Есть 3 таблицы на foxpro. Как организовать каскадное удаление записей? делаю delete from mark where kod_mark=4, удаляется только из таблицы marka, а связанная запись из таблицы zajavka не удаляется. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 20:49 |
|
Каскадное удаление данных
|
|||
---|---|---|---|
#18+
НадеждаМ, а триггеры-то сгенерированы? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 20:56 |
|
Каскадное удаление данных
|
|||
---|---|---|---|
#18+
проходящий., Вот на триггеры у меня ругалося ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 20:58 |
|
Каскадное удаление данных
|
|||
---|---|---|---|
#18+
щас не ругается, но и не удаляется ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 20:59 |
|
Каскадное удаление данных
|
|||
---|---|---|---|
#18+
НадеждаМщас не ругается, но и не удаляетсяНу так и разбирайтесь с ними. Пока не будет триггеров ни о каких каскадных действиях не можт быть и речи. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 21:01 |
|
Каскадное удаление данных
|
|||
---|---|---|---|
#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.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 21:05 |
|
Каскадное удаление данных
|
|||
---|---|---|---|
#18+
procedure __RI_UPDATE_marka ** "Referential integrity update trigger for" marka LOCAL llRetVal llRetVal = .t. PRIVATE pcParentDBF,pnParentRec,pcChildDBF,pnChildRec,pcParentID,pcChildID PRIVATE pcParentExpr,pcChildExpr STORE "" TO pcParentDBF,pcChildDBF,pcParentID,pcChildID,pcParentExpr,pcChildExpr STORE 0 TO pnParentRec,pnChildRec IF _triggerlevel=1 BEGIN TRANSACTION PRIVATE pcRIcursors,pcRIwkareas,pcRIolderror,pnerror,; pcOldDele,pcOldExact,pcOldTalk,pcOldCompat,PcOldDBC pcOldTalk=SET("TALK") SET TALK OFF pcOldDele=SET("DELETED") pcOldExact=SET("EXACT") pcOldCompat=SET("COMPATIBLE") SET COMPATIBLE OFF SET DELETED ON SET EXACT OFF pcRIcursors="" pcRIwkareas="" pcRIolderror=ON("error") pnerror=0 ON ERROR pnerror=rierror(ERROR(),message(),message(1),program()) IF TYPE('gaErrors(1)')<>"U" release gaErrors ENDIF PUBLIC gaErrors(1,12) pcOldDBC=DBC() SET DATA TO ("MAGAZIN") ENDIF first trigger LOCAL lcParentID && parent's value to be sought in child LOCAL lcOldParentID && previous parent id value LOCAL lcChildWkArea && child work area handle returned by riopen LOCAL lcChildID && child's value to be sought in parent LOCAL lcOldChildID && old child id value LOCAL lcParentWkArea && parentwork area handle returned by riopen LOCAL lcStartArea lcStartArea=select() llRetVal=.t. lcParentWkArea=select() SELECT (lcParentWkArea) pcParentDBF=dbf() pnParentRec=recno() lcOldParentID=OLDVAL("KOD_MARK") pcParentID=lcOldParentID pcParentExpr="KOD_MARK" lcParentID=KOD_MARK IF lcParentID<>lcOldParentID lcChildWkArea=riopen("zajavka") IF lcChildWkArea<=0 IF _triggerlevel=1 DO riend WITH .F. ENDIF at the end of the highest trigger level SELECT (lcStartArea) RETURN .F. ENDIF not able to open the child work area pcChildDBF=dbf(lcChildWkArea) SELECT (lcChildWkArea) SCAN FOR KOD_MARK=lcOldParentID pnChildRec=recno() pcChildID=KOD_MARK pcChildExpr="KOD_MARK" IF NOT llRetVal EXIT ENDIF && not llretval llRetVal=riupdate("KOD_MARK",lcParentID,"MARKA") ENDSCAN get all of the zajavka records =rireuse("zajavka",lcChildWkArea) IF NOT llRetVal IF _triggerlevel=1 DO riend WITH llRetVal ENDIF at the end of the highest trigger level SELECT (lcStartArea) RETURN llRetVal ENDIF ENDIF this parent id changed IF _triggerlevel=1 do riend with llRetVal ENDIF at the end of the highest trigger level SELECT (lcStartArea) RETURN llRetVal ** "End of Referential integrity Update trigger for" marka ******************************************************************************** ******************************************************************************** procedure __RI_UPDATE_zajavka ** "Referential integrity update trigger for" zajavka LOCAL llRetVal llRetVal = .t. PRIVATE pcParentDBF,pnParentRec,pcChildDBF,pnChildRec,pcParentID,pcChildID PRIVATE pcParentExpr,pcChildExpr STORE "" TO pcParentDBF,pcChildDBF,pcParentID,pcChildID,pcParentExpr,pcChildExpr STORE 0 TO pnParentRec,pnChildRec IF _triggerlevel=1 BEGIN TRANSACTION PRIVATE pcRIcursors,pcRIwkareas,pcRIolderror,pnerror,; pcOldDele,pcOldExact,pcOldTalk,pcOldCompat,PcOldDBC pcOldTalk=SET("TALK") SET TALK OFF pcOldDele=SET("DELETED") pcOldExact=SET("EXACT") pcOldCompat=SET("COMPATIBLE") SET COMPATIBLE OFF SET DELETED ON SET EXACT OFF pcRIcursors="" pcRIwkareas="" pcRIolderror=ON("error") pnerror=0 ON ERROR pnerror=rierror(ERROR(),message(),message(1),program()) IF TYPE('gaErrors(1)')<>"U" release gaErrors ENDIF PUBLIC gaErrors(1,12) pcOldDBC=DBC() SET DATA TO ("MAGAZIN") ENDIF first trigger LOCAL lcParentID && parent's value to be sought in child LOCAL lcOldParentID && previous parent id value LOCAL lcChildWkArea && child work area handle returned by riopen LOCAL lcChildID && child's value to be sought in parent LOCAL lcOldChildID && old child id value LOCAL lcParentWkArea && parentwork area handle returned by riopen LOCAL lcStartArea lcStartArea=select() llRetVal=.t. lcChildWkArea=select() IF _triggerlevel=1 or type("pccascadeparent")#"C" or (NOT pccascadeparent=="MARKA") SELECT (lcChildWkArea) lcChildID=KOD_MARK lcOldChildID=oldval("KOD_MARK") pcChildDBF=dbf(lcChildWkArea) pnChildRec=recno(lcChildWkArea) pcChildID=lcOldChildID pcChildExpr="KOD_MARK" if isnull(lcChildID) or isnull(lcOldChildID) or lcChildID <> lcOldChildID lcParentWkArea=riopen("marka","kod_mark") IF lcParentWkArea<=0 IF _triggerlevel=1 DO riend WITH .F. ENDIF at the end of the highest trigger level SELECT (lcStartArea) RETURN .F. ENDIF not able to open the child work area pcParentDBF=dbf(lcParentWkArea) llRetVal=SEEK(lcChildID,lcParentWkArea) pnParentRec=recno(lcParentWkArea) if llRetVal and not (isrlocked(pnParentRec, lcParentWkArea) or ; isflocked(lcParentWkArea)) if rlock(lcParentWkArea) unlock record pnParentRec in (lcParentWkArea) else =rireuse("tparen",lcParentWkArea) pnError = rierror(-1,"Insert restrict rule violated.","","") IF _triggerlevel=1 DO riend WITH llRetVal ENDIF at the end of the highest trigger level SELECT (lcStartArea) RETURN llRetVal endif endif =rireuse("marka",lcParentWkArea) IF NOT llRetVal pnError = rierror(-1,"Insert restrict rule violated.","","") IF _triggerlevel=1 DO riend WITH llRetVal ENDIF at the end of the highest trigger level SELECT (lcStartArea) RETURN llRetVal ENDIF no parent ENDIF this value was changed ENDIF not part of a cascade from "marka" IF _triggerlevel=1 or type("pccascadeparent")#"C" or (NOT pccascadeparent=="ZAPCHASTI") SELECT (lcChildWkArea) lcChildID=KOD_ZAPCH lcOldChildID=oldval("KOD_ZAPCH") pcChildDBF=dbf(lcChildWkArea) pnChildRec=recno(lcChildWkArea) pcChildID=lcOldChildID pcChildExpr="KOD_ZAPCH" if isnull(lcChildID) or isnull(lcOldChildID) or lcChildID <> lcOldChildID lcParentWkArea=riopen("zapchasti","kod_zapch") IF lcParentWkArea<=0 IF _triggerlevel=1 DO riend WITH .F. ENDIF at the end of the highest trigger level SELECT (lcStartArea) RETURN .F. ENDIF not able to open the child work area pcParentDBF=dbf(lcParentWkArea) llRetVal=SEEK(lcChildID,lcParentWkArea) pnParentRec=recno(lcParentWkArea) if llRetVal and not (isrlocked(pnParentRec, lcParentWkArea) or ; isflocked(lcParentWkArea)) if rlock(lcParentWkArea) unlock record pnParentRec in (lcParentWkArea) else =rireuse("tparen",lcParentWkArea) pnError = rierror(-1,"Insert restrict rule violated.","","") IF _triggerlevel=1 DO riend WITH llRetVal ENDIF at the end of the highest trigger level SELECT (lcStartArea) RETURN llRetVal endif endif =rireuse("zapchasti",lcParentWkArea) IF NOT llRetVal pnError = rierror(-1,"Insert restrict rule violated.","","") IF _triggerlevel=1 DO riend WITH llRetVal ENDIF at the end of the highest trigger level SELECT (lcStartArea) RETURN llRetVal ENDIF no parent ENDIF this value was changed ENDIF not part of a cascade from "zapchasti" lcParentWkArea=lcChildWkArea IF _triggerlevel=1 do riend with llRetVal ENDIF at the end of the highest trigger level SELECT (lcStartArea) RETURN llRetVal ** "End of Referential integrity Update trigger for" zajavka ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 21:09 |
|
Каскадное удаление данных
|
|||
---|---|---|---|
#18+
НадеждаМ, Вы мне предлагаете эти нечитаемые портянки ковырять? Вы сами не можете по ним пройтись отладчиком? Перегенерите триггеры и работайте. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 21:15 |
|
Каскадное удаление данных
|
|||
---|---|---|---|
#18+
Cascade удаление удаляет не все записи?! http://www.sql.ru/forum/actualthread.aspx?tid=242155#2147944 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 21:17 |
|
Каскадное удаление данных
|
|||
---|---|---|---|
#18+
Прошлась отладчиком, но так ничего и не выявила как я поняла, ошибки должны записываться в массив gaerrors, но у меня там .f. везде. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 22:06 |
|
Каскадное удаление данных
|
|||
---|---|---|---|
#18+
НадеждаМПрошлась отладчиком, но так ничего и не выявила как я поняла, ошибки должны записываться в массив gaerrors, но у меня там .f. везде.А отладчик нужен только ошибки ловить? Вы там команды delete видели? Если нет, то чего Вы от таких триггеров ждете? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 23:20 |
|
Каскадное удаление данных
|
|||
---|---|---|---|
#18+
Простите мне мою глупость, нашла свою ошибку. Просто pack не сделала после того как в дочерней таблице zajavka запись пометилась на удаление. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 23:22 |
|
Каскадное удаление данных
|
|||
---|---|---|---|
#18+
НадеждаМ Просто pack не сделала после того как в дочерней таблице zajavka запись пометилась на удаление. жесть. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2010, 09:20 |
|
Каскадное удаление данных
|
|||
---|---|---|---|
#18+
НадеждаМЕсть 3 таблицы на foxpro. Как организовать каскадное удаление записей? делаю delete from mark where kod_mark=4, удаляется только из таблицы marka, а связанная запись из таблицы zajavka не удаляется. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2010, 10:53 |
|
Каскадное удаление данных
|
|||
---|---|---|---|
#18+
rewareНадеждаМЕсть 3 таблицы на foxpro. Как организовать каскадное удаление записей? делаю delete from mark where kod_mark=4, удаляется только из таблицы marka, а связанная запись из таблицы zajavka не удаляется. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
ты что, дурик, детям показываешь? зачем ты PACK написал, злодей? брысь на фоксклаб - курить. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2010, 11:01 |
|
Каскадное удаление данных
|
|||
---|---|---|---|
#18+
reware, Спасибо, но я уже сделала. Pack только вот забыла. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2010, 11:48 |
|
Каскадное удаление данных
|
|||
---|---|---|---|
#18+
НадеждаМreware, Спасибо, но я уже сделала. Pack только вот забыла. теперь расскажите: - зачем Вы пакуете записи в таблице? - Вы в курсе того, что делает эта команда? - Вы задаетесь вопросами разработки приложений, с которыми одновременно работает много пользователей? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2010, 11:57 |
|
Каскадное удаление данных
|
|||
---|---|---|---|
#18+
Delete помечает на удаление записи, а pack эти записи удаляет. В данном случае никакое не приложение, а просто лаба в универе. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2010, 12:00 |
|
Каскадное удаление данных
|
|||
---|---|---|---|
#18+
НадеждаМDelete помечает на удаление записи, а pack эти записи удаляет. В данном случае никакое не приложение, а просто лаба в универе. аааа ну так подготовьтесь заранее к ответу на вопрос препода: а что будет если Ваши таблички будут юзать 2 пользователя? пак - это "страшная" команда с точки зрения грамотного разработчика. для справки: при команде пак, вначале лочится таблица, из нее записи переливаются в новый файл, а старый удаляется. в сети, когда с таблицами одновр.работают неск.пользователей такого делать нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2010, 12:05 |
|
Каскадное удаление данных
|
|||
---|---|---|---|
#18+
прошелмимо, как же тогда удалить записи, не используя pack? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2010, 12:20 |
|
Каскадное удаление данных
|
|||
---|---|---|---|
#18+
НадеждаМпрошелмимо, как же тогда удалить записи, не используя pack? Вам не достаточно того, что записи помечены на удаление? поиском: -set deleted -бинарный индекс(дополнительно для погружения в тему оптимизации) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2010, 12:33 |
|
Каскадное удаление данных
|
|||
---|---|---|---|
#18+
прошелмимо, Помечены то помечены, но в таблице то оно видны ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2010, 13:03 |
|
Каскадное удаление данных
|
|||
---|---|---|---|
#18+
НадеждаМпрошелмимо, Помечены то помечены, но в таблице то оно видны кем и кому видны? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2010, 13:16 |
|
Каскадное удаление данных
|
|||
---|---|---|---|
#18+
НадеждаМпрошелмимо, Помечены то помечены, но в таблице то оно видныНу так сделайте невидимыми. Или Вы не умеете? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2010, 13:26 |
|
|
start [/forum/search_topic.php?author=grigs&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 442ms |
total: | 594ms |
0 / 0 |