• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы 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 рекурсивно удаляющие записи либо убить этот контрейнт и добавить его сново на пустую табдицу.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

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