Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Как временно отключить каскадное удаление / 12 сообщений из 12, страница 1 из 1
03.02.2016, 12:08
    #39161787
Yava1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно отключить каскадное удаление
Подскажите, плз как правильно поступить:

1.Есть основная табла, относительно небольшого размера, и на неё ссылается внешний индекс с каскадным удалением из очень большой таблы.
2.Надо удалить пачку записей из основной таблы, при этом соответственно срабатывает удаление из подчиненной таблы. Предварительно из этой подчиненной таблы записи для удаления удаляються напрямую.
3. Т.е при удалении из основной таблы системный триггер каскадного удаления в подчиненной табле возвращает 100, так как в подчиненной табле записи уже удалили. Но вот эти попытки удалить несуществующие записи отжирают все время работы.

Как правильно решить проблему ? может на момент удаления из основной таблы можна отключить каскадное удаление ? но незнаю как
...
Рейтинг: 0 / 0
03.02.2016, 12:26
    #39161829
Yava1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно отключить каскадное удаление
Забыл указать - сервер ASA 10.0.1
...
Рейтинг: 0 / 0
03.02.2016, 14:52
    #39162052
antand
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно отключить каскадное удаление
Yava1,

Непонятно вот это - "возвращает 100, так как в подчиненной табле записи уже удалили. Но вот эти попытки удалить несуществующие записи отжирают все время работы."
Если все спроектировано правильно, то удаление в системном триггере будет работать быстро т.к. записи уже удалили. Но убирать удаление нельзя, если Вам целостность нужна.
А если "предварительно из этой подчиненной таблы записи для удаления удаляються напрямую." будет всегда выполняться, то может Вам и каскадное удаление не нужно. А индекс можно и без FK создать по полю в подчиненной.
...
Рейтинг: 0 / 0
03.02.2016, 15:34
    #39162105
Yava1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно отключить каскадное удаление
Я имел ввиду оператор delete из триггера возвращает код 100 - "запись не найдена". перекраивать БД не очень хочется, я не разработчик - саппорт..
...
Рейтинг: 0 / 0
03.02.2016, 16:11
    #39162169
antand
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно отключить каскадное удаление
Yava1,
Интересно посмотреть на код вашего триггера c delete
Вот из документации
Error constant SQLE_NOTFOUND
SQLCODE 100
You positioned a cursor beyond the beginning or past the end of the query. There is no row at that position

Простой оператор delete from t1 where....
SQLCODE 100 возвращать по идее не должен.
...
Рейтинг: 0 / 0
03.02.2016, 16:25
    #39162189
antand
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно отключить каскадное удаление
Я имел ввиду delete from t1 where.... - оператор в триггере где t1 - подчиненная
А не Ваш оператор delete на основной
...
Рейтинг: 0 / 0
03.02.2016, 17:49
    #39162281
Yava1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно отключить каскадное удаление
antand,

Тригер обычный, сгенеренный автоматом при создании внешнего ключа:

create trigger REFACTION after delete on DBA.CEO_Operations_Achive
referencing old as oldkey
for each row
begin
delete from DBA.CEO_Oper_CLL_archive
where oper_id = oldkey.id and oper_filial = oldkey.filial
end

а код 100 я уже вижу при разборе трассировки в каждой конкретной команде delete from DBA.CEO_Oper_CLL_archive ....
...
Рейтинг: 0 / 0
03.02.2016, 18:12
    #39162299
antand
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно отключить каскадное удаление
Yava1,

А на CEO_Oper_CLL_archive нет триггеров своих?
...
Рейтинг: 0 / 0
04.02.2016, 10:14
    #39162674
Yava1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно отключить каскадное удаление
antand

Нету
...
Рейтинг: 0 / 0
04.02.2016, 13:16
    #39162885
antand
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно отключить каскадное удаление
Yava1,

А вообще кроме как Вы говорите "тормозов", этот код 100 мешает Вам при delete из основной?
При удалении из подчиненной вручную, т.е. без использования триггера, но с where по тем же полям, тормоза есть?
Может дело в большом объеме подчиненной.
...
Рейтинг: 0 / 0
04.02.2016, 16:45
    #39163182
Yava1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно отключить каскадное удаление
antand,
Да.Дело в большом объеме подчиненной. Решил перед удалением в основной буду дропать внешний индекс, а потом строить. Так в разы быстрее работает
...
Рейтинг: 0 / 0
04.02.2016, 17:11
    #39163213
antand
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно отключить каскадное удаление
Yava1,

Можно еще вместо этого триггера сделать триггер на удаление типа statement в CEO_Operations_Achive
А в нем
delete from CEO_Oper_CLL_archive t2 from deleted t1
where t2.oper_id = t1.id and t2.oper_filial = t1.filial
Т.е. за один оператор delete по основной, даже если в основной удаляются много записей, делать все удаления в подчиненной одним оператором, а не по каждой записи
Только индекс отдельный надо создать на подчиненной, если FK уберете

Еще вариант, но править придется логику Когда таблица действительно большая и время критично, то проще добавить в подчиненную поле "признак удаления". Использовать те же oper_id и oper_filial(обнулять их)
При удалении в основной делать update в подчиненной(update в данном случае сработает быстрее чем delete)
А ночью удалять помеченные.
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Как временно отключить каскадное удаление / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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