• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Удаление записей

  • Автор темы Balda
  • Дата начала
Статус
Закрыто для дальнейших ответов.
B

Balda

СУБД MS SQL 2005.
Проблема:
Код:
DELETE FROM Table1 WHERE ID = 10
при попытке удаления записи из таблицы возникает сообщение о том, что есть ссылки на данную запись из других таблиц.
Как можно сделать внешние ключи данной таблицы неактивными/активными? В Oracle это можно было сделать так:
Код:
ALTER TABLE Table1
Disable constraint fk_1
А как это реализуеться в MS SQL 2005?
 
B

Balda

Мне нужно просто удалить запись.
Проблема в том, что на первичный ключ данной таблицы есть ссылки из дочерних таблиц.
Удалять внешние ключи из дочерних таблиц долго, потому что их много.
И что делать?
 
B

Balda

Каскадное удаление используется. Для внешних ключей.
А проблема с первичным ключом, на который ссылаються дочерние таблицы.
Разве для первичного ключа есть каскадное удаление?
 
E

etc

Ниче не понятно,
у вас, связь один к одному? или про какие первичные ключи идет речь?
 
S

SkinGreek

текст ошибки покажите плз.
Там по всей видимости указана таблица FK. которой не имеет каскадного удаления.
MS SQL не позволит вам разрушить целостность данных, и правильно сделает. То что оракл дает диактивировать FK может и хорошо, но я на 101% уверен что он не даст вам активировать FK сново при удалении PK. Просто потому что вы попросите его следить за целостностью данных при том что сама БД будет содержать потерянные ссылки(будут записи в FK-таблице ссылающиеся на несуществующие записи в PK-таблице)
Как альтернатива диактивации FK-констрейнта можно предложить удаление констрейнта через ALTER TABLE DROP CONSTRAINT <FK_1>, ну и соотвественно альтернатива активации - ALTER TABLE ADD CONSTRAINT <FK_1>


Из всего этого следует что вам необходимо либо полностью снять ответственность с БД за целостность данных(удалением констрейнтов), либо в этих констрейнтах указать каскадное удаление, либо в SP удаления записи из PK-таблицы, в которой сначала удалять подчиненные записи из FK таблиц а потом уже удалять запись из PK-таблицы.В этом случае скорее всего будет чисто SP-утилита программиста, а сама система будет требовать от пользователя самостоятельно удалять подчиненные записи через GUI.

В большинстве случаев лучшее решение - каскадного удаление. Но иногда это чревато удалением кучи полезной инфы. Тогда связь просто обеспечивает целостность данных запретом(как в вашем случае), и в этом случае необходимо сознательно удалять подчиненные записи.

Если ничего не понятно, то коротко - пройдитесь по всем FK и поставте каскадное удаление:)
Если таблица связана сама с собой(ухо) - то тут ничего не поделаешь и стоит либо написать SP рекурсивно удаляющие записи либо убить этот контрейнт и добавить его сново на пустую табдицу.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!