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

Тема в разделе "SQL", создана пользователем Balda, 4 ноя 2008.

Статус темы:
Закрыта.
  1. Balda

    Balda Гость

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

    etc Гость

    А зачем вам "битые" ссылки?
     
  3. Balda

    Balda Гость

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

    etc Гость

    Выставить каскадное удаление на связь?
     
  5. Balda

    Balda Гость

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

    etc Гость

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

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

Поделиться этой страницей