Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 как элегантно решается след. проблема  [new]
brauncomm
Member

Откуда:
Сообщений: 8
продолжение темы:
https://www.sql.ru/forum/actualthread.aspx?tid=724680

таблица Ideas (IdeaID...)
таблица UserFavorites(..., IdeaID,...)
Ключ есть, но стоит No Action, удаление cascade поставить нельзя (зациклится, т.к. есть ещё связи), поле not null (set null не поставишь)...
Нужно удалить запись из Ideas

Сообщение было отредактировано: 4 янв 10, 13:45
4 янв 10, 13:43    [8146183]     Ответить | Цитировать Сообщить модератору
 Re: как элегантно решается след. проблема  [new]
Glory
Member

Откуда:
Сообщений: 104760
Убрать связь и написать триггер
4 янв 10, 13:46    [8146197]     Ответить | Цитировать Сообщить модератору
 Re: как элегантно решается след. проблема  [new]
brauncomm
Member

Откуда:
Сообщений: 8
связь именно убрать полностью? А как же целостность DB и т.д.?
4 янв 10, 13:54    [8146217]     Ответить | Цитировать Сообщить модератору
 Re: как элегантно решается след. проблема  [new]
Glory
Member

Откуда:
Сообщений: 104760
brauncomm
связь именно убрать полностью? А как же целостность DB и т.д.?

Ну так вы для этой целостности и пишите триггер. Разве не так ?
4 янв 10, 13:57    [8146225]     Ответить | Цитировать Сообщить модератору
 Re: как элегантно решается след. проблема  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Так и не понял, что мешает написать триггер INSTEAD OF DELETE,
в котором удалять (или присваивать полям FOREIGN KEY значение NULL)
сначала ссылающиеся записи UserFavorites, а потом удалять записи самой таблицы Ideas?
4 янв 10, 13:59    [8146235]     Ответить | Цитировать Сообщить модератору
 Re: как элегантно решается след. проблема  [new]
brauncomm
Member

Откуда:
Сообщений: 8
iap
Так и не понял, что мешает написать триггер INSTEAD OF DELETE,
в котором удалять (или присваивать полям FOREIGN KEY значение NULL)
сначала ссылающиеся записи UserFavorites, а потом удалять записи самой таблицы Ideas?


ALTER TRIGGER [dbo].[IdeasDelete]
   ON [dbo].[Ideas]
   INSTEAD OF DELETE
AS 
BEGIN
	SET NOCOUNT ON;
	DECLARE @IdeaID int
	SELECT @IdeaID = IdeaID from deleted
	DELETE FROM UserFavorites where IdeaID = @IdeaID
END

Msg 2113, Level 16, State 1, Procedure IdeasDelete, Line 10
Cannot alter INSTEAD OF DELETE or UPDATE TRIGGER 'IdeasDelete' on table 'dbo.Ideas' because the table has a FOREIGN KEY with cascaded DELETE or UPDATE.
4 янв 10, 14:05    [8146247]     Ответить | Цитировать Сообщить модератору
 Re: как элегантно решается след. проблема  [new]
Glory
Member

Откуда:
Сообщений: 104760
brauncomm

Msg 2113, Level 16, State 1, Procedure IdeasDelete, Line 10
Cannot alter INSTEAD OF DELETE or UPDATE TRIGGER 'IdeasDelete' on table 'dbo.Ideas' because the table has a FOREIGN KEY with cascaded DELETE or UPDATE.

А кто-то уверял, что "удаление cascade поставить нельзя (зациклится, т.к. есть ещё связи)"
А сообщение говорит, что каскадные удаления установлены
4 янв 10, 14:07    [8146252]     Ответить | Цитировать Сообщить модератору
 Re: как элегантно решается след. проблема  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
brauncomm
iap
Так и не понял, что мешает написать триггер INSTEAD OF DELETE,
в котором удалять (или присваивать полям FOREIGN KEY значение NULL)
сначала ссылающиеся записи UserFavorites, а потом удалять записи самой таблицы Ideas?


ALTER TRIGGER [dbo].[IdeasDelete]
   ON [dbo].[Ideas]
   INSTEAD OF DELETE
AS 
BEGIN
	SET NOCOUNT ON;
	DECLARE @IdeaID int
	SELECT @IdeaID = IdeaID from deleted
	DELETE FROM UserFavorites where IdeaID = @IdeaID
END

Msg 2113, Level 16, State 1, Procedure IdeasDelete, Line 10
Cannot alter INSTEAD OF DELETE or UPDATE TRIGGER 'IdeasDelete' on table 'dbo.Ideas' because the table has a FOREIGN KEY with cascaded DELETE or UPDATE.
Хотите использовать у себя сразу все возможные способы обеспечения RI?
Но Вы же сами писали
brauncomm
Ключ есть, но стоит No Action, удаление cascade поставить нельзя (зациклится, т.к. есть ещё связи), поле not null (set null не поставишь)...


Мне пока приходит в голову только отказ от каскадных действий через FK при удалении и реализация этого
исключительно в триггерах INSTEAD OF DELETE
4 янв 10, 14:13    [8146259]     Ответить | Цитировать Сообщить модератору
 Re: как элегантно решается след. проблема  [new]
brauncomm
Member

Откуда:
Сообщений: 8
Glory
brauncomm

Msg 2113, Level 16, State 1, Procedure IdeasDelete, Line 10
Cannot alter INSTEAD OF DELETE or UPDATE TRIGGER 'IdeasDelete' on table 'dbo.Ideas' because the table has a FOREIGN KEY with cascaded DELETE or UPDATE.

А кто-то уверял, что "удаление cascade поставить нельзя (зациклится, т.к. есть ещё связи)"
А сообщение говорит, что каскадные удаления установлены


именно так, таблица UserFavorites

http://www.magicscreenshot.com/jpg/9jSA9XpKSU4.html
4 янв 10, 14:16    [8146267]     Ответить | Цитировать Сообщить модератору
 Re: как элегантно решается след. проблема  [new]
Glory
Member

Откуда:
Сообщений: 104760
brauncomm
Glory
brauncomm

Msg 2113, Level 16, State 1, Procedure IdeasDelete, Line 10
Cannot alter INSTEAD OF DELETE or UPDATE TRIGGER 'IdeasDelete' on table 'dbo.Ideas' because the table has a FOREIGN KEY with cascaded DELETE or UPDATE.

А кто-то уверял, что "удаление cascade поставить нельзя (зациклится, т.к. есть ещё связи)"
А сообщение говорит, что каскадные удаления установлены


именно так, таблица UserFavorites

http://www.magicscreenshot.com/jpg/9jSA9XpKSU4.html

Так там две связи на скриншоте
4 янв 10, 14:20    [8146271]     Ответить | Цитировать Сообщить модератору
 Re: как элегантно решается след. проблема  [new]
brauncomm
Member

Откуда:
Сообщений: 8
так вторая связь никакого отношения не имеет к Ideas
4 янв 10, 14:23    [8146283]     Ответить | Цитировать Сообщить модератору
 Re: как элегантно решается след. проблема  [new]
Glory
Member

Откуда:
Сообщений: 104760
brauncomm
так вторая связь никакого отношения не имеет к Ideas

А как она тогда оказалась на скриншоте ?
И почему вы показываете свойства таблицы UserFavorites, а триггер делаете для Ideas ?

Сообщение было отредактировано: 4 янв 10, 14:27
4 янв 10, 14:26    [8146291]     Ответить | Цитировать Сообщить модератору
 Re: как элегантно решается след. проблема  [new]
brauncomm
Member

Откуда:
Сообщений: 8
Glory
brauncomm
так вторая связь никакого отношения не имеет к Ideas

А как она тогда оказалась на скриншоте ?
И почему вы показываете свойства таблицы UserFavorites, а триггер делаете для Ideas ?


да, тупанул.
В Ideas очень много связей с cascade, мне что, все их нужно удалить? Сомнительная "элегантность".
4 янв 10, 14:37    [8146314]     Ответить | Цитировать Сообщить модератору
 Re: как элегантно решается след. проблема  [new]
Glory
Member

Откуда:
Сообщений: 104760
brauncomm
Glory
brauncomm
так вторая связь никакого отношения не имеет к Ideas

А как она тогда оказалась на скриншоте ?
И почему вы показываете свойства таблицы UserFavorites, а триггер делаете для Ideas ?


да, тупанул.
В Ideas очень много связей с cascade, мне что, все их нужно удалить? Сомнительная "элегантность".

Не удалить, а отключить каскадные операции. И реализовать их в триггере.
Либо спроектировать такую схему данных, где нет циклических связей
4 янв 10, 14:42    [8146330]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить