Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Функция "Можно ли удалить запись?"  [new]
monomakh
Member

Откуда: Краснодар
Сообщений: 570
Приветствие!

При попытке удаления записи может быть такая ситуация, что строку удалить нельзя из-за того, что на неё завязан внешний ключ. Oracle выдаст соответсвующую ошибку. Есть ли такая функция, с помощью которой можно было бы проверить можно ли удалить запись или же она завязана и удалить её нельзя?
12 июл 06, 15:16    [2871695]     Ответить | Цитировать Сообщить модератору
 Re: Функция "Можно ли удалить запись?"  [new]
Калина
Member

Откуда: Moskau
Сообщений: 2649
Думаю что select ! А может быть даже delete +exception
------------------------------
Not affilated with VAZ
12 июл 06, 15:17    [2871709]     Ответить | Цитировать Сообщить модератору
 Re: Функция "Можно ли удалить запись?"  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18370
monomakh
При попытке удаления записи может быть такая ситуация, что строку удалить нельзя из-за того, что на неё завязан внешний ключ. Oracle выдаст соответсвующую ошибку. Есть ли такая функция, с помощью которой можно было бы проверить можно ли удалить запись или же она завязана и удалить её нельзя?

Есть. Это delete и последующая секция обработки исключительных ситуаций.
12 июл 06, 15:17    [2871710]     Ответить | Цитировать Сообщить модератору
 Re: Функция "Можно ли удалить запись?"  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18370
Калина
Думаю что select !

Не угадал. Между селектом и удалением может пройти фиксация транзакции, вставившей детаила к удаляемому паренту
12 июл 06, 15:19    [2871731]     Ответить | Цитировать Сообщить модератору
 Re: Функция "Можно ли удалить запись?"  [new]
Vadim_Maximov
Member

Откуда: Москва
Сообщений: 3571
Ага, есть такая функция
begin
  delete from ...
exception
  when others then
    if sqlcode = -02292 then
      raise_application_error('Запись удалить нельзя!');
    end if;
end;
12 июл 06, 15:20    [2871744]     Ответить | Цитировать Сообщить модератору
 Re: Функция "Можно ли удалить запись?"  [new]
Калина
Member

Откуда: Moskau
Сообщений: 2649
А у тебя не совсем к задаче тогда решение! имхо человек просил проверить- можно-ли удалять! твой вариант не позволяет просто узнать, что можно!!!
:-)))
хотя по сути - ты ,конечно, прав
------------------------------
Not affilated with VAZ
12 июл 06, 15:21    [2871760]     Ответить | Цитировать Сообщить модератору
 Re: Функция "Можно ли удалить запись?"  [new]
Падонак
Member [заблокирован]

Откуда: из лесу
Сообщений: 1775
monomakh
Приветствие!

При попытке удаления записи может быть такая ситуация, что строку удалить нельзя из-за того, что на неё завязан внешний ключ. Oracle выдаст соответсвующую ошибку. Есть ли такая функция, с помощью которой можно было бы проверить можно ли удалить запись или же она завязана и удалить её нельзя?

думаю, что проверять дочерние записи и удалять их (если их нет) - двойная работа

лучше удалять одной операцией, и если не прошло по причине именно наличия дочерних записей, то выдавать клиенту сообщение

короче, как уже говорилось delete/exceptions
12 июл 06, 15:22    [2871771]     Ответить | Цитировать Сообщить модератору
 Re: Функция "Можно ли удалить запись?"  [new]
monomakh
Member

Откуда: Краснодар
Сообщений: 570
delete/exception не подходит, так как никто delete делать и не собирается. Мы собираемся делать update set del=1, если нет завязок
12 июл 06, 15:28    [2871842]     Ответить | Цитировать Сообщить модератору
 Re: Функция "Можно ли удалить запись?"  [new]
Калина
Member

Откуда: Moskau
Сообщений: 2649
update table set del=1 where id=:ID and not exists( ....проверяйте любые завязки....)
------------------------------
Not affilated with VAZ
12 июл 06, 15:30    [2871863]     Ответить | Цитировать Сообщить модератору
 Re: Функция "Можно ли удалить запись?"  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18370
monomakh
delete/exception не подходит, так как никто delete делать и не собирается. Мы собираемся делать update set del=1, если нет завязок

Ерунда полная получится...
Лучше уж savepoint - delete/exception handler - rollback to savepoint - update.
12 июл 06, 15:32    [2871884]     Ответить | Цитировать Сообщить модератору
 Re: Функция "Можно ли удалить запись?"  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18370
А можно уточнить - что же вызывает у автора столь бурное веселье? Имхо плакать надо...
12 июл 06, 15:34    [2871900]     Ответить | Цитировать Сообщить модератору
 Re: Функция "Можно ли удалить запись?"  [new]
Падонак
Member [заблокирован]

Откуда: из лесу
Сообщений: 1775
andrey_anonymous
А можно уточнить - что же вызывает у автора столь бурное веселье? Имхо плакать надо...

Андрей, ты чего-то не договариваешь :)
12 июл 06, 15:38    [2871940]     Ответить | Цитировать Сообщить модератору
 Re: Функция "Можно ли удалить запись?"  [new]
Падонак
Member [заблокирован]

Откуда: из лесу
Сообщений: 1775
Калина
update table set del=1 where id=:ID and not exists( ....проверяйте любые завязки....)
------------------------------
Not affilated with VAZ


видимо, афтар успел наплодить гору дочерних таблиц
12 июл 06, 15:40    [2871950]     Ответить | Цитировать Сообщить модератору
 Re: Функция "Можно ли удалить запись?"  [new]
Падонак
Member [заблокирован]

Откуда: из лесу
Сообщений: 1775
andrey_anonymous
monomakh
delete/exception не подходит, так как никто delete делать и не собирается. Мы собираемся делать update set del=1, если нет завязок

Ерунда полная получится...
Лучше уж savepoint - delete/exception handler - rollback to savepoint - update.


есть еще один экстремальный вариант - изменять значение PK родительской записи

(ессно, при отсуцтвии всяческих deffered)
12 июл 06, 15:42    [2871980]     Ответить | Цитировать Сообщить модератору
 Re: Функция "Можно ли удалить запись?"  [new]
monomakh
Member

Откуда: Краснодар
Сообщений: 570
Калина, мне нужна функция с помощью, которой я выясню буду ли я делать update вообще или нет. Сами то мы её написать можем, так как можно узнать какие внешние ключи завязаны, можно узнать и колонку в таблице, которая имеет связь, ну и потом уже проверить наличие id в этих колонках для каждой связи.

Так то мы скорее всего делать и будем, просто наш шеф уверен, что должна быть стандартная функция Oracle. Oracle как-то ведь проверяет можно удалить запись или нет.
12 июл 06, 15:43    [2871992]     Ответить | Цитировать Сообщить модератору
 Re: Функция "Можно ли удалить запись?"  [new]
Vadim_Maximov
Member

Откуда: Москва
Сообщений: 3571
monomakh
Калина, мне нужна функция с помощью, которой я выясню буду ли я делать update вообще или нет. Сами то мы её написать можем, так как можно узнать какие внешние ключи завязаны, можно узнать и колонку в таблице, которая имеет связь, ну и потом уже проверить наличие id в этих колонках для каждой связи.

Так то мы скорее всего делать и будем, просто наш шеф уверен, что должна быть стандартная функция Oracle. Oracle как-то ведь проверяет можно удалить запись или нет.
В словарь лазить не устанете?...
12 июл 06, 15:45    [2872010]     Ответить | Цитировать Сообщить модератору
 Re: Функция "Можно ли удалить запись?"  [new]
Падонак
Member [заблокирован]

Откуда: из лесу
Сообщений: 1775
функтсыи такой стандартной нет
12 июл 06, 15:47    [2872027]     Ответить | Цитировать Сообщить модератору
 Re: Функция "Можно ли удалить запись?"  [new]
Калина
Member

Откуда: Moskau
Сообщений: 2649
monomakh
Калина, мне нужна функция с помощью, которой я выясню буду ли я делать update вообще или нет. Сами то мы её написать можем, так как можно узнать какие внешние ключи завязаны, можно узнать и колонку в таблице, которая имеет связь, ну и потом уже проверить наличие id в этих колонках для каждой связи.

Так то мы скорее всего делать и будем, просто наш шеф уверен, что должна быть стандартная функция Oracle. Oracle как-то ведь проверяет можно удалить запись или нет.

Имхо Андрей вам все написал . Сразу после того, как вы узнали что можно - могет стать нельзя и наооборот.
проще delete-exception
12 июл 06, 15:47    [2872036]     Ответить | Цитировать Сообщить модератору
 Re: Функция "Можно ли удалить запись?"  [new]
Двоюшник
Member

Откуда: Киев
Сообщений: 1135
ИМХО если есть on delete cascade или on delete set null, то не хорошо получится при delete + exception

---
Ну ты заходи ежели чё...
12 июл 06, 16:02    [2872178]     Ответить | Цитировать Сообщить модератору
 Re: Функция "Можно ли удалить запись?"  [new]
RA\/EN
Member

Откуда:
Сообщений: 3659
monomakh
delete/exception не подходит, так как никто delete делать и не собирается. Мы собираемся делать update set del=1, если нет завязок


Идиотизм. Если ты поставишь del=1, то никто не мешает потом на эту запись влепить ссылку, и состояние флага del будет недостоверным.

Шефу скажите, что бы научился отличать ЯДРО от ИНТЕРФЕЙСА - это к любой системе относится.
12 июл 06, 16:02    [2872181]     Ответить | Цитировать Сообщить модератору
 Re: Функция "Можно ли удалить запись?"  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Вот случись небывалое - прийди архангел и дай тому автору его процедуру.
(begin savepoint delete rollback to savepoint return true exception rollback to savepoint return false end)
И что она ему скажет? Что удалять можно БЫЛО. Читай - а щас уже - х его з.

Сталбыть - вопрос вредный.
Надо сделать над собой усилие и понять почему никогда не следует
задавать (и себе и базе) таких вопросов..
12 июл 06, 18:29    [2873301]     Ответить | Цитировать Сообщить модератору
 Re: Функция "Можно ли удалить запись?"  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
Well:

a) Add unique constraint to parent table on PK column(s)+del column
b) Add parent_del column to child tables.
c) Add check constraint to child table restricting parent_del column to value 0.
d) Add parent_del column to FK on child table.

Now update table set del=1 will fail if there are child rows. And it will take care of "Идиотизм. Если ты поставишь del=1, то никто не мешает потом на эту запись влепить ссылку, и состояние флага del будет недостоверным".

SY.
12 июл 06, 19:14    [2873511]     Ответить | Цитировать Сообщить модератору
 Re: Функция "Можно ли удалить запись?"  [new]
Падонак
Member [заблокирован]

Откуда: из лесу
Сообщений: 1775
в порядке бреда:

делаем в таблитсэ колонку old_pk
при "удалении" делаем PK отрицательным
за одно и фильтровать т.н. "удаленные" прощще
и если PK сменить удалось, значит родительская запись была без дочерних.
если в это время кто-то чето подчиненное этой записи вставлял - он обломитцо
13 июл 06, 02:12    [2874082]     Ответить | Цитировать Сообщить модератору
 Re: Функция "Можно ли удалить запись?"  [new]
Калина
Member

Откуда: Moskau
Сообщений: 2649
Падонак
в порядке бреда:

делаем в таблитсэ колонку old_pk
при "удалении" делаем PK отрицательным
за одно и фильтровать т.н. "удаленные" прощще
и если PK сменить удалось, значит родительская запись была без дочерних.
если в это время кто-то чето подчиненное этой записи вставлял - он обломитцо

При ,изначально неверном ,подходе озвученном автором - покатит. Хотя конечно так делать не стоит имхо
13 июл 06, 07:23    [2874182]     Ответить | Цитировать Сообщить модератору
 Re: Функция "Можно ли удалить запись?"  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Калина
Падонак
в порядке бреда:

делаем в таблитсэ колонку old_pk
при "удалении" делаем PK отрицательным
за одно и фильтровать т.н. "удаленные" прощще
и если PK сменить удалось, значит родительская запись была без дочерних.
если в это время кто-то чето подчиненное этой записи вставлял - он обломитцо

При ,изначально неверном ,подходе озвученном автором - покатит.

+1, только не въехал зачем колонку добавлять - меняй знак, в той, что есть..
Калина
Хотя конечно так делать не стоит имхо

+1
13 июл 06, 11:30    [2875216]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить