0

У меня есть следующая настройка таблицы.Каскадные удаления в SQL Sever 2008 не работают

Bag 
    | 
    +-> BagID (Guid) 
    +-> BagNumber (Int) 

BagCommentRelation 
    | 
    +-> BagID (Int) 
    +-> CommentID (Guid) 

BagComment 
    | 
    +-> CommentID (Guid) 
    +-> Text (varchar(200)) 

BagCommentRelation имеет внешние ключи к сумке и сумке.

Итак, я включил каскадные удаления для обоих внешних ключей, но когда я удаляю сумку, она не удаляет строку Comment.

Нужно ли срабатывать триггер? Или я чего-то не хватает?

(Я использую SQL Server 2008)


Примечание: Проводка запрошенный SQL. Это определение таблицы BagCommentRelation. (У меня был типа неправильно bagID (я думал, что это была справы, но это целое).)

CREATE TABLE [dbo].[Bag_CommentRelation](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [BagId] [int] NOT NULL, 
    [Sequence] [int] NOT NULL, 
    [CommentId] [int] NOT NULL, 
CONSTRAINT [PK_Bag_CommentRelation] PRIMARY KEY CLUSTERED 
(
    [BagId] ASC, 
    [Sequence] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

ALTER TABLE [dbo].[Bag_CommentRelation] WITH CHECK ADD CONSTRAINT [FK_Bag_CommentRelation_Bag] FOREIGN KEY([BagId]) 
REFERENCES [dbo].[Bag] ([Id]) 
ON DELETE CASCADE 
GO 

ALTER TABLE [dbo].[Bag_CommentRelation] CHECK CONSTRAINT [FK_Bag_CommentRelation_Bag] 
GO 

ALTER TABLE [dbo].[Bag_CommentRelation] WITH CHECK ADD CONSTRAINT [FK_Bag_CommentRelation_Comment] FOREIGN KEY([CommentId]) 
REFERENCES [dbo].[Comment] ([CommentId]) 
ON DELETE CASCADE 
GO 

ALTER TABLE [dbo].[Bag_CommentRelation] CHECK CONSTRAINT [FK_Bag_CommentRelation_Comment] 
GO 

Строка в таблице удаления, но строки в комментариях таблице не.

ответ

1

С вашей текущей структурой, запись BagComment не будет удалена при удалении Bag, только запись BagCommentRelation. Каскады удаления от Bag до BagCommentRelation, но останавливаются там. Структура, которая у вас похожа на отношение «Много-ко-многим» между Bag и BagCommentRelation. Зачем вам нужен BagCommentRelation?

Edit: Это звучит, как проще всего сделать было бы сделать структуру, как это:

Bag 
    | 
    +-> BagID (Guid) 
    +-> BagNumber (Int) 

BagComment 
    | 
    +-> BagID (Guid) 
    +-> Text (varchar(200)) 

но используя таблицу BagComment (или Comment) для обозначения нескольких объектов добавить некоторые сложности. Если это то, что вам нужно сделать, this question должен предоставить помощь.

+0

В нашей таблице комментариев есть много разных типов комментариев. В некоторых таблицах используются гиды, некоторые функции для ПК. Кроме того, в одном пакете может быть много комментариев. Похоже, мне нужно выбрать либо листы, либо целые числа, а FK перейти непосредственно из моего стола. – Vaccano

1

Ваш стол BagCommentRelation в виде отношения n: m между Bag и BagComments, поэтому это таблица подробностей для обеих таблиц.

Ограничение DELETE CASCADE будет работать только с таблицей подробностей, поэтому BagComment не может быть удален, если сумка удалена.

Который заставляет меня задаться вопросом, как комментарий к сумме может быть применен к нескольким сумочкам.

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

+0

Комментарий может применяться только к одному предмету (сумке, пользователю независимо). Возможно, мы использовали неправильную структуру таблицы.Если у нас есть отношение «один к многим» (сумка для комментариев), тогда у нас просто есть идентификатор CommentID в сумке, а затем FK From bag, чтобы прокомментировать? (и выровняете таблицу отношений?) – Vaccano

+0

@ Ваккано, вам не требуется BagCommentRelation. Просто добавить BagID в BagComment должно быть достаточно (если вам нужно больше, чем 1 комментарий к сумке) – devio

1

Лично я не использовал бы каскадное удаление вообще. Что, если бы потребность пришла в большую группу сумок? Cascade delete может привязывать ваши таблицы в течение нескольких часов. Лучше всего конкретно писать нужные вам удаления.

Смежные вопросы