2

ユーザーが「投稿」を投稿し、ユーザーがこれらの投稿に「コメント」できるWebサイトを作成しています。3 つのテーブルを持つデータベースがあります。1 つはユーザー情報、1 つは投稿情報、最後の 1 つはコメント情報です。

ユーザーが削除された場合、すべての投稿とコメントが削除され、ユーザーが投稿の 1 つを削除した場合、関連するすべてのコメントが削除されるようにルールを設定したいと考えています。ただし、これにより「複数の CASCADE パス」が設定されます。

私は解決策を探していて、トリガーに関する情報を見つけました。それらは使用するのに最適なものでしょうか?それらを使用した場合、すべてのCASCADESをトリガーによって実行されるように変更する必要がありますか?

ありがとう

クライベスト

4

3 に答える 3

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)とは異なり、削除ステートメントを太く指でつなぐと、非常に迅速に多くの損傷が発生する可能性があります。カスケード削除は、一挙に大量のデータを削除した場合、トランザクションログを非常に迅速に処理することもできます。

于 2010-10-06T17:02:47.820 に答える
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
于 2010-10-06T16:59:51.517 に答える
0

別のオプションは、必要に応じてこれらの削除手順を実行する 2 つの専用ストアド プロシージャを作成することです。

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

2 番目のルールについては、次のようになります。

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

   DELETE FROM dbo.Posts
   WHERE ID = @PostID
END

この場合、実際に何が起こるかを完全に制御できます。カスケード削除による予期しない驚きはなく、トリガーを使用する必要もありません。

于 2010-10-06T17:08:42.247 に答える