|
Как временно отключить каскадное удаление
|
|||
---|---|---|---|
#18+
Подскажите, плз как правильно поступить: 1.Есть основная табла, относительно небольшого размера, и на неё ссылается внешний индекс с каскадным удалением из очень большой таблы. 2.Надо удалить пачку записей из основной таблы, при этом соответственно срабатывает удаление из подчиненной таблы. Предварительно из этой подчиненной таблы записи для удаления удаляються напрямую. 3. Т.е при удалении из основной таблы системный триггер каскадного удаления в подчиненной табле возвращает 100, так как в подчиненной табле записи уже удалили. Но вот эти попытки удалить несуществующие записи отжирают все время работы. Как правильно решить проблему ? может на момент удаления из основной таблы можна отключить каскадное удаление ? но незнаю как ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2016, 12:08 |
|
Как временно отключить каскадное удаление
|
|||
---|---|---|---|
#18+
Забыл указать - сервер ASA 10.0.1 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2016, 12:26 |
|
Как временно отключить каскадное удаление
|
|||
---|---|---|---|
#18+
Yava1, Непонятно вот это - "возвращает 100, так как в подчиненной табле записи уже удалили. Но вот эти попытки удалить несуществующие записи отжирают все время работы." Если все спроектировано правильно, то удаление в системном триггере будет работать быстро т.к. записи уже удалили. Но убирать удаление нельзя, если Вам целостность нужна. А если "предварительно из этой подчиненной таблы записи для удаления удаляються напрямую." будет всегда выполняться, то может Вам и каскадное удаление не нужно. А индекс можно и без FK создать по полю в подчиненной. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2016, 14:52 |
|
Как временно отключить каскадное удаление
|
|||
---|---|---|---|
#18+
Я имел ввиду оператор delete из триггера возвращает код 100 - "запись не найдена". перекраивать БД не очень хочется, я не разработчик - саппорт.. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2016, 15:34 |
|
Как временно отключить каскадное удаление
|
|||
---|---|---|---|
#18+
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 возвращать по идее не должен. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2016, 16:11 |
|
Как временно отключить каскадное удаление
|
|||
---|---|---|---|
#18+
Я имел ввиду delete from t1 where.... - оператор в триггере где t1 - подчиненная А не Ваш оператор delete на основной ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2016, 16:25 |
|
Как временно отключить каскадное удаление
|
|||
---|---|---|---|
#18+
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 .... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2016, 17:49 |
|
Как временно отключить каскадное удаление
|
|||
---|---|---|---|
#18+
Yava1, А на CEO_Oper_CLL_archive нет триггеров своих? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2016, 18:12 |
|
Как временно отключить каскадное удаление
|
|||
---|---|---|---|
#18+
antand Нету ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2016, 10:14 |
|
Как временно отключить каскадное удаление
|
|||
---|---|---|---|
#18+
Yava1, А вообще кроме как Вы говорите "тормозов", этот код 100 мешает Вам при delete из основной? При удалении из подчиненной вручную, т.е. без использования триггера, но с where по тем же полям, тормоза есть? Может дело в большом объеме подчиненной. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2016, 13:16 |
|
Как временно отключить каскадное удаление
|
|||
---|---|---|---|
#18+
antand, Да.Дело в большом объеме подчиненной. Решил перед удалением в основной буду дропать внешний индекс, а потом строить. Так в разы быстрее работает ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2016, 16:45 |
|
Как временно отключить каскадное удаление
|
|||
---|---|---|---|
#18+
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) А ночью удалять помеченные. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2016, 17:11 |
|
|
start [/forum/topic.php?fid=55&msg=39162169&tid=2009736]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
71ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
others: | 370ms |
total: | 515ms |
0 / 0 |