SQL Server级联

时间:2010-10-06 16:48:53

标签: sql sql-server database-design triggers cascade

我正在创建一个网站,用户可以发布“帖子”,然后用户可以对这些帖子进行“评论”。我有一个包含3个表的数据库。一个包含用户信息,一个包含发布信息,最后一个包含评论信息。

我想设置规则,以便在删除用户时删除所有帖子和评论,如果用户删除了其中一个帖子,则会删除所有相关评论。但是,这会设置“多个CASCADE路径”。

我一直在寻找解决方案并找到有关触发器的一些信息。它们是最好用的吗?如果我使用它们,我是否必须更改所有由触发器完成的CASCADES?

由于

Clivest

3 个答案:

答案 0 :(得分:2)

使用声明性参照完整性。

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中删除一行将删除bar中的所有相关行。

小心删除级联删除 - 胖指法删除语句会很快造成很多损害,与* nix中的rm(1)不同。如果你一举删除大量数据,级联删除也可以很快地扼杀你的事务日志。

答案 1 :(得分:0)

我认为这可以很容易地设置,没有你遇到的错误,也没有使用触发器,如下所示:

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

答案 2 :(得分:0)

另一种选择是创建两个专用存储过程,根据需要执行这些删除步骤

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

在这种情况下,您可以完全控制实际发生的事情,级联删除没有意外的惊喜,也不需要使用触发器。