none
Проблемы с FOREIGN KEY RRS feed

  • Вопрос

  • CУБД MS SQL 2008 R2.

    Ситуация такая:

    Есть таблица Message с двумя внешними ключами SenderUserId и ReceiverUserId для которых первичным ключом является поле UserId таблицы пользователей. Правило на  ON DELETE  SET NULL - т.е. SenderUserId или ReceiverUserId должны становиться NULL при удалении связанного с ними пользователя.

    Так вот проблема такая: на одно поле такой внешний ключ создается без проблем, при попытке создать такой же внешний ключ на

    второе поле, получаю ошибку:

    - Не удалось создать связь "FK_Message_aspnet_Users". 
    Введение ограничения внешнего ключа (FOREIGN KEY) "FK_Message_aspnet_Users" для таблицы "Message" может привести к появлению циклов или множественных каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION либо измените другие ограничения внешнего ключа (FOREIGN KEY).
    Нельзя создать ограничение. См. предыдущие ошибки.

    Какие нафик циклы или коскадные пути при SET NULL, учитывая, что сами внешние ключи ни для кого первичными не являются????  - Microsoft, чё юмору от Петросяна учился??

    Вопрос: как обойти этот косяк, может какой нибудь фикс есть, т.к. это же явный косяк СУБД.  

    (Сразу скажу, что триггер это не вариант)


    • Изменено A.G.Sedov 18 февраля 2012 г. 14:42
    18 февраля 2012 г. 14:40

Ответы

Все ответы

  • by design

    Но вы можете проголосовать за фитбек - http://connect.microsoft.com/SQLServer/feedback/details/470632/foreign-key-that-references-the-same-table

    Вероятность того, что этот код когда-то заработает велика, т.к. фитбек в статусе Active


    http://www.t-sql.ru

    • Помечено в качестве ответа Abolmasov Dmitry 20 февраля 2012 г. 11:00
    20 февраля 2012 г. 8:04
    Модератор
  • Спасибо,

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

    И я так понимаю, вот это:

    Thanks for this bug report.

    Yes, this situation is well-defined and could be made to work. But, we don't support it in the current release. (We would perhaps do this at the same time as adding support for ON DELETE CASCADE - which requires some re-jigging inside the Query Optimizer, to allow possible multiple passes over the table).

    This feature is on our TODO list.

    Sorry,

    Jim Hogg

    и есть ответ Microsoft на этот вопрос. Очень печально, что не известно когда эту фичу реализуют. 

    2. И как-то не понятно вот это: We would perhaps do this at the same time as adding support for ON DELETE CASCADE  - вообщето ON DELETE CASCADE и сейчас работает, если не больше одной связи между двумя  таблицами.




    • Изменено A.G.Sedov 21 февраля 2012 г. 9:40
    21 февраля 2012 г. 9:38