SQL Server Каскадирование - PullRequest
       10

SQL Server Каскадирование

2 голосов
/ 06 октября 2010

Я создаю веб-сайт, на котором пользователи могут публиковать сообщения, а затем пользователи могут комментировать эти сообщения.У меня есть база данных с 3 таблицами.Один содержит информацию о пользователе, один содержит информацию о сообщении, а последний содержит информацию о комментариях.

Я хочу установить правила, чтобы при удалении пользователя удалялись все его сообщения и комментарии, а если пользовательудаляет одну из своих публикаций, затем все связанные комментарии удаляются.Это, однако, устанавливает «Несколько путей CASCADE».

Я искал решение и нашел некоторую информацию о триггерах.Будут ли они лучше всего использовать?Если бы я использовал их, пришлось бы мне менять все КАСКАДЫ, чтобы они выполнялись триггерами?

Спасибо

Clivest

Ответы [ 3 ]

2 голосов
/ 06 октября 2010

использовать декларативную ссылочную целостность.

create table foo
(
  id   int         not null primary key ,
  foo  varchar(32) not null ,
)
create table bar
(
  id     int not null primary key ,
  foo_id int     null foreign key references foo ( id ) on delete cascade ,
)

удаление строки из foo приведет к удалению всех связанных строк на панели.

Будьте осторожны с каскадным удалением, хотя - сложное удаление оператора удаления может очень быстро нанести большой ущерб, в отличие от rm (1) в * nix. Каскадные удаления также могут быстро проверить ваш журнал транзакций, если вы удалите много данных одним махом.

0 голосов
/ 06 октября 2010

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

CREATE PROCEDURE dbo.DeleteUser @UserID VARCHAR(50)
AS BEGIN
   DELETE FROM dbo.Comments
   WHERE Author = @UserID

   DELETE FROM dbo.Posts
   WHERE Author = @UserID

   DELETE FROM dbo.User
   WHERE UserID = @UserID
END

и для второго правила:

CREATE PROCEDURE dbo.DeletePost @PostID INT
AS BEGIN
   DELETE FROM dbo.Comments
   WHERE PostID = @PostID

   DELETE FROM dbo.Posts
   WHERE ID = @PostID
END

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

0 голосов
/ 06 октября 2010

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

1) The foreign key between Users and Posts should be set up to be cascade delete
2) The foreign key between Posts and Comments should be set up to be cascade delete
...