Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Cascade удаление удаляет не все записи?! / 11 сообщений из 11, страница 1 из 1
06.07.2006, 12:14
    #33835206
Лисонька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cascade удаление удаляет не все записи?!
Леди и джентльмены!
Заметила этот свой недочет в проекте лишь сегодня и была озадачена. Объясняю в общих чертах.
Table1: nIdCod, cFio, cAdres. Primary индекс на nIdCod.
Table2: nId, nIdCod, dDate, cComment. Primary индекс на nId, Regular на nIdCod.
В DB Disigner установлен Relationship "один ко многим" от Table1 к Table2 по индексам на nIdCod. Когда делаю триггер, получается, что Table1 является Parent, а Table2 - Child, на Delete выставлено Cascade. Как я рассчитывала, при удалении записи в Table1 из Table2 должны удаляться все записи с таким же nIdCod. А сегодня заглянула в таблицу и очень удивилась. В Table2 всегда после удаления остается 1 запись из тех, которые, по идее, должны каскадно удалитсья при удалении родительской записи.
Извините, что так путанно объясняю пробему. Но кто догадался, что я хотела сказать, посоветуйте.
Благодарю.
...
Рейтинг: 0 / 0
06.07.2006, 12:34
    #33835277
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cascade удаление удаляет не все записи?!
Пиведите, код при удалении, желательно так как он у Вас реализован, а не пример кода.
...
Рейтинг: 0 / 0
06.07.2006, 12:41
    #33835308
Cascade удаление удаляет не все записи?!
ЛисонькаЛеди и джентльмены!
Заметила этот свой недочет в проекте лишь сегодня и была озадачена. Объясняю в общих чертах.
Table1: nIdCod, cFio, cAdres. Primary индекс на nIdCod.
Table2: nId, nIdCod, dDate, cComment. Primary индекс на nId, Regular на nIdCod.
В DB Disigner установлен Relationship "один ко многим" от Table1 к Table2 по индексам на nIdCod. Когда делаю триггер, получается, что Table1 является Parent, а Table2 - Child, на Delete выставлено Cascade. Как я рассчитывала, при удалении записи в Table1 из Table2 должны удаляться все записи с таким же nIdCod. А сегодня заглянула в таблицу и очень удивилась. В Table2 всегда после удаления остается 1 запись из тех, которые, по идее, должны каскадно удалитсья при удалении родительской записи.
Извините, что так путанно объясняю пробему. Но кто догадался, что я хотела сказать, посоветуйте.
Благодарю.
Сделай процедуру по поиску "провисших ссылок" (т.е. таблица2-parent, а таблица1-Child) и удаляй из таблицы2 те записи, для которых нет "пары" в таблице1. поставь эту процедуру в раздел "Администрирование" и запускай периодически....
...
Рейтинг: 0 / 0
06.07.2006, 12:47
    #33835333
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cascade удаление удаляет не все записи?!
Какая версия FoxPro?

Приведи код процедуры каскадного удаления. Это в хранимых процедурах, начинается с

procedure RIDELETE

В некоторых версиях VFP там была ошибка, а кроме того, этот код может не сработать при определенных условиях.
...
Рейтинг: 0 / 0
06.07.2006, 13:45
    #33835554
Лисонька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cascade удаление удаляет не все записи?!
PaulWistПиведите, код при удалении, желательно так как он у Вас реализован, а не пример кода.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
** Это в Loade**
= CURSORSETPROP('Buffering',  5 , 'Table1')

** Это на KeyPress кнопки  **
   SELECT Table1
   REPLACE Table1.cFio WITH ALLTRIM(STR(Table1.nIdCod, 6 , 0 ))    && Может и лишнее, но делаю для того, чтобы, если; 
                                                                                                         пользователям вновь придется внести этого же человека, ;
                                                                                                         на нарушилась уникальность другого индека этой же таблицы
   REPLACE Table1.cAdres WITH ALLTRIM(STR(Table1.nIdCod, 6 , 0 ))
   ........
   DELETE 
   GO TOP IN Table1
   =TABLEUPDATE(.t.)
авторСделай процедуру по поиску "провисших ссылок" (т.е. таблица2-parent, а таблица1-Child) и удаляй из таблицы2 те записи, для которых нет "пары" в таблице1. поставь эту процедуру в раздел "Администрирование" и запускай периодически....
Можно и код написать на удаление по nIdCod, но почему триггер так работает?
авторКакая версия FoxPro?
Приведи код процедуры каскадного удаления. Это в хранимых процедурах, начинается с
procedure RIDELETE
В некоторых версиях VFP там была ошибка, а кроме того, этот код может не сработать при определенных условиях.
Вроде бы выслала то, что Вы попросили.
...
Рейтинг: 0 / 0
06.07.2006, 14:11
    #33835633
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cascade удаление удаляет не все записи?!
Это не то.

Это текста собственно триггера, но внутри себя он вызывает другую процедуру вот этой командой

llRetVal=ridelete()

Так вот, RIDELETE - это процедура созданная там же. Она как раз и обеспечивает сам факт удаления.

А триггер __RI_DELETE_table1 - это по сути, просто цикл, который перебирает все записи, которые он планирует удалить и вызывает для удаления функцию RIDELETE(). Вот код этой самой функции и хотелось бы посмотреть.
...
Рейтинг: 0 / 0
06.07.2006, 14:40
    #33835726
Лисонька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cascade удаление удаляет не все записи?!
ВладимирМЭто не то.
Это текста собственно триггера, но внутри себя он вызывает другую процедуру вот этой командой
llRetVal=ridelete()
Так вот, RIDELETE - это процедура созданная там же. Она как раз и обеспечивает сам факт удаления.
А триггер __RI_DELETE_table1 - это по сути, просто цикл, который перебирает все записи, которые он планирует удалить и вызывает для удаления функцию RIDELETE(). Вот код этой самой функции и хотелось бы посмотреть.
Уважаемый Гуру!
Я приношу свои извинения, но значить я попросту не знаю, где находится процедура RIDELETE. Поскольку по поиску в Stored Procedure этого слова я не нахожу, значит, процедура прописана где-то еще. Вопрос: а где тогда ее можно посмотреть, скопировать и выложить на форум?
Благодарю.
...
Рейтинг: 0 / 0
06.07.2006, 14:49
    #33835764
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cascade удаление удаляет не все записи?!
RIDELETE вообще-то одна из самых первых после фразы

**__RI_HEADER!@ Do NOT REMOVE or MODIFY this line!!!! @!__RI_HEADER**

Однако если ее не нашли, то как же вообще триггер работает? Ведь в присланном фрагменте явно прописан ее вызов

llRetVal=ridelete()

Попробуй сделать тестовую базу с 2 таблицам и создай для них триггер на удаление по типу Cascade.

Кроме того, команду TableUpdate() "в никуда" давать просто нельзя. Как же отлавливать возможные ошибки? Как минимум, нужно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
IF TableUpdate(.T.) = .F.
	LOCAL laError( 1 )
	=AERROR(laError)
	IF laError[ 1 , 1 ] =  1539  && ошибка триггера
		* Смотрим глобальный массив gaErrors
		* Этот массив создается и напоняется внутри тела триггера 
		* и содержит причину возникновения ошибки
	ENDIF
ENDIF
...
Рейтинг: 0 / 0
06.07.2006, 15:00
    #33835816
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cascade удаление удаляет не все записи?!
В дополнение, поскольку идет каскадное обновление FK, не мешало бы обернуть модификацию в транзакцию.


ВладимирМ

Кстати, на View такой фокус не прошел бы.

Код: plaintext
1.
2.
3.
4.
REPLACE Table1.cAdres WITH ALLTRIM(STR(Table1.nIdCod, 6 , 0 ))
   ........
   DELETE
   GO TOP IN Table1
   =TABLEUPDATE(.t.)
...
Рейтинг: 0 / 0
07.07.2006, 10:01
    #33837349
Лисонька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cascade удаление удаляет не все записи?!
Сделала БД из двух таблиц. Выставила триггер. Та же история. Сегодня утром проделала эту процедуру на другом компьютере. Там все нормально (фоксовый дитрибутив на машинах один и тот же). Тогда я снесла Фокс у себя и инсталльнула заново. В проекте заново расставила триггеры. И все заработало. Появился код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure RIDELETE
local llRetVal
llRetVal=.t.
 IF (ISRLOCKED() and !deleted()) OR !RLOCK()
    llRetVal=.F.
  ELSE
    IF !deleted()
      DELETE
      IF CURSORGETPROP('BUFFERING') >  1 
      	=TABLEUPDATE()
      ENDIF
    ENDIF not already deleted
  ENDIF
  UNLOCK RECORD (RECNO())
  llRetVal=pnerror= 0 
RETURN llRetVal
Благодарю всех-всех-всех!

Елизавета Скрунскайте
...
Рейтинг: 0 / 0
07.07.2006, 11:36
    #33837780
Лисонька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cascade удаление удаляет не все записи?!
ВладимирМКроме того, команду TableUpdate() "в никуда" давать просто нельзя.
Каюсь, Учитель!.. Вы же мне еще месяца два назад попеняли на эту "безадресность". Я везде в проекте переправила, а про кнопку для удаления не подумала (((
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Cascade удаление удаляет не все записи?! / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]