Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Введение ограничения внешнего ключа, может привести к появлению циклов 
V
    Опции темы
Crypton
  Дата 3.11.2009, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 9.10.2006
Где: США, Санкт-Петерб ург

Репутация: нет
Всего: 2



Задача. Есть две таблицы: Пользователи и ЛичныеСообщения (Members, ForumPrivateMessages). В личных сообщениях есть столбцы From/To (от/кому) которые связаны с Id пользователя в Members. Надо что-бы если пользователя удаляют, то при удалении либо удалять все связанные с ним сообщения, или присваивать null к To/From. При попытке создать связь вылетает следующее. Кто поможет или лучше сделать триггер?

Цитата

'Members' table saved successfully
'ForumPrivateMessages' table
- Unable to create relationship 'FK_ForumPrivateMessages_ToMembers'.  
Введение ограничения внешнего ключа (FOREIGN KEY) "FK_ForumPrivateMessages_ToMembers" для таблицы "ForumPrivateMessages" может привести к появлению циклов или множественных каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION либо измените другие ограничения внешнего ключа (FOREIGN KEY).
Нельзя создать ограничение. См. предыдущие ошибки.


Дизайн базы данных http://dl.getdropbox.com/u/40766/db.png
--------------------
«Все, что вы знаете — ложь» Теория мироздания 
PM MAIL WWW ICQ Skype   Вверх
Zioma
Дата 3.11.2009, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 22.8.2007

Репутация: 5
Всего: 5



А код создания внешнего ключа можешь привести?
Если все делаешь в дизайнере, то скрин.
PM MAIL   Вверх
Itsys
Дата 3.11.2009, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 1
Всего: 34



Не видя базу, сложно сказать. Не хочет так - сделай тригер на удаление, кторый удлит все сообщения.
PM MAIL WWW Skype   Вверх
Akina
Дата 4.11.2009, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



Цитата(Crypton @  3.11.2009,  19:58 Найти цитируемый пост)
если пользователя удаляют, то при удалении либо удалять все связанные с ним сообщения, или присваивать null к To/From.

 smile а зачем??? Просто ID удалённого пользователя не используй больше никогда.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Crypton
Дата 4.11.2009, 07:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 9.10.2006
Где: США, Санкт-Петерб ург

Репутация: нет
Всего: 2



Цитата(Zioma @ 3.11.2009,  12:25)
А код создания внешнего ключа можешь привести?
Если все делаешь в дизайнере, то скрин.

Сгенерированный
Код

BEGIN TRANSACTION
GO
ALTER TABLE dbo.ForumPrivateMessages ADD CONSTRAINT
    FK_ForumPrivateMessages_Members FOREIGN KEY
    (
    [From]
    ) REFERENCES dbo.Members
    (
    Id
    ) ON UPDATE  NO ACTION 
     ON DELETE  CASCADE 
    
GO
ALTER TABLE dbo.ForumPrivateMessages ADD CONSTRAINT
    FK_ForumPrivateMessages_Members1 FOREIGN KEY
    (
    [To]
    ) REFERENCES dbo.Members
    (
    Id
    ) ON UPDATE  NO ACTION 
     ON DELETE  CASCADE 
    
GO
ALTER TABLE dbo.ForumPrivateMessages SET (LOCK_ESCALATION = TABLE)


Цитата

smile а зачем??? Просто ID удалённого пользователя не используй больше никогда.


Надо потом в коде разбираться если пользователь еще актуален. Тобишь если задаем нуль, то просто (LINQ), From != null, ну а если удаляем, то вообще проверки кода логически никогда не произойдет.

Цитата
    
Не видя базу, сложно сказать. 

Хм, думал диаграмма этот вопрос покроет
--------------------
«Все, что вы знаете — ложь» Теория мироздания 
PM MAIL WWW ICQ Skype   Вверх
Itsys
Дата 4.11.2009, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 1
Всего: 34



В документации четко написано:
Код

The series of cascading referential actions triggered by a single DELETE or UPDATE must form a tree containing no 
circular references. No table can appear more than once in the list of all cascading referential actions that result 
from the DELETE or UPDATE. The tree of cascading referential actions must not have more than one path to any 
given table
. Any branch of the tree is terminated when it encounters a table for which NO ACTION has been 
specified or is the default.


Так что, только тригеры  smile 

Это сообщение отредактировал(а) Itsys - 4.11.2009, 09:36
PM MAIL WWW Skype   Вверх
Crypton
Дата 4.11.2009, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 9.10.2006
Где: США, Санкт-Петерб ург

Репутация: нет
Всего: 2



Тоесть получается, что нельзя иметь более одной связи с одними и теми-же таблицами?
--------------------
«Все, что вы знаете — ложь» Теория мироздания 
PM MAIL WWW ICQ Skype   Вверх
Itsys
Дата 4.11.2009, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 1
Всего: 34



нельзя
PM MAIL WWW Skype   Вверх
Zloxa
Дата 5.11.2009, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 10
Всего: 161



Можно.
Нельзя допускать рекурсивных циклов на каскадном обновлении.



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 5.11.2009, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



Цитата(Crypton @  4.11.2009,  08:16 Найти цитируемый пост)
Надо потом в коде разбираться если пользователь еще актуален. Тобишь если задаем нуль, то просто (LINQ), From != null, ну а если удаляем, то вообще проверки кода логически никогда не произойдет.

Мне это кажется бредом воспалённого сознания.
ID - уникальный идентификатор записи - на то и УНИКАЛЬНЫЙ, чтобы встретиться один раз, и навсегда. Чтобы его использовала только подсистема обеспечения целостности и непротиворечивости информации. И этот уникальный идентификатор должен быть верен своей записи до тех пор, пока существует эта таблица или хотя бы одна другая таблица, которая связана с этой по этому полю. И неважно, удалена запись или нет. 
А если так - зачем её удалять?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 5.11.2009, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 10
Всего: 161



Цитата(Akina @  5.11.2009,  10:21 Найти цитируемый пост)
А если так - зачем её удалять? 

Странный вопрос ;)

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

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

Это сообщение отредактировал(а) Zloxa - 5.11.2009, 11:42


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 5.11.2009, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



Zloxa, обрати внимание - ТС рассматривает вариант НЕ-удаления мессаг при удалении юзера как вполне допустимый. Чисто ноль прописАть ему кажется достаточным. 
В этих условиях удаление пользователя - ну несерьёзно...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 5.11.2009, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 10
Всего: 161



Akina, даже на этом форуме я встречал посты от анигелированных ныне пользователей. Если пользователей удаляют, видимо, ожидают от того какого то бенефита. Серьезен он или нет, не нам судить, но задуматься ТС над тем, думается, таки следовало бы. smile


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Crypton
Дата 5.11.2009, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 9.10.2006
Где: США, Санкт-Петерб ург

Репутация: нет
Всего: 2



Ладно. Посчитаю проблемой решенной. Буду тупо проверять средствами LINQ. (pm.FromMember!=null).
--------------------
«Все, что вы знаете — ложь» Теория мироздания 
PM MAIL WWW ICQ Skype   Вверх
fanat12
Дата 30.1.2010, 12:23 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 30.1.2010

Репутация: нет
Всего: нет



Помогите!
использую  MSSQL Server 2005 ,не работает каскадное удаление .Необходимо удалить personinfo,contacts,recommendator, оставить im
даю ссылку на диаграмму.

http://2img.org.ua/v.php?id=c99b5c37285cf7...5138a51d1af.png



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.1045 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.