2017-04-03 4 views
0
SQL Server 2012の中でいくつかのテーブルを作成するための

私のクエリは次のとおりです。削除カスケードエラーの場合 - どのようにトリガで解決できますか?

create table Poll_Question_Table (
    PollQuestionId int primary key, 
    PollQuestionTex varchar(max), 
    PollStatus int , 
    PollStartDate date, 
    PollEndDate date, 
    PollCatagoryId int foreign key references Poll_Catagory_Table on update cascade on delete cascade 
) 

create table Poll_Catagory_Table(
    PollCatagoryId int primary key, 
    PollCatagoryName varchar(100), 
    PollCatagoryDescription varchar(max) 
) 

create table Poll_Answer_Table(
    PollAnswerId int primary key, 
    PollAnswerText varchar(max), 
    PollQuestionId int foreign key references Poll_Question_Table on update cascade on delete cascade 
) 

create table Poll_Vote_Table (
    PollVoteId int primary key, 
    PollQuestionId int foreign key references Poll_Question_Table on update cascade on delete cascade , 
    PollAnswerId int foreign key references Poll_Answer_Table on update cascade on delete cascade, 
    PollCount int 
) 

とエラーが テーブルの上にFOREIGN KEY制約「FK__Poll_Vote__PollA__5A3A55A2」を紹介

は「Poll_Vote_Table」サイクルが発生したりします複数のカスケード経路。 ON DELETE NO ACTIONまたはON UPNATE NO ACTIONを指定するか、他の FOREIGN KEY制約を変更してください。 どうすればこの問題を解決できますか?

+0

使用しているdbmsにタグを付けます。他の2つのテーブル定義も追加します。 – jarlh

+0

なぜあなたは下のテーブルでレコードを削除した後にメインテーブルから削除したいのですか? – Whencesoever

答えて

0

あなたの問題を解決する方法はたくさんあります。

1-最も簡単な方法:テーブルPoll_Vote_Tableを質問用に2つ、Answers用に1つずつ変更します。

2削除/更新の代わりにトリガーを使用します。それはあなたが望むものを、実際のですが、今のトリガー(for reference)を使用するコードをソリューション1.を考えてみてください。

(私は質問の一部について説明します回答のために、それは同じだ。。)まず

あなたは(削除した後)、次のようにあなたのFKを再作成する必要があります:

ALTER TABLE [dbo].[Poll_Vote_Table] WITH CHECK 
ADD CONSTRAINT [FK_Vote_Question] FOREIGN KEY([PollQuestionId]) 
REFERENCES [dbo].[Poll_Question_Table] ([PollQuestionId]) 

その後、あなたはトリガを作成する必要があります。

CREATE TRIGGER [DELETE_Question_Vote] 
    ON dbo.[Poll_Question_Table] 
    INSTEAD OF DELETE 
AS 
BEGIN 
SET NOCOUNT ON; 
DELETE FROM [Poll_Vote_Table] WHERE PollQuestionId IN (SELECT PollQuestionId FROM DELETED) 
DELETE FROM [Poll_Question_Table] WHERE PollQuestionId IN (SELECT PollQuestionId FROM DELETED) 
END 
GO 

更新部分があります通常は役に立たないので、私はそれについて書きませんが、DELETEと基本的に同じです。

+0

情報のためだけに、あなたは 'CREATE TRIGGER [DELETE_Question_Vote] ON dbo。[Poll_Question_Table] FOR DELETE AS'を使ってDELETEの後に行くことができます。これでもうFKは必要ありません。それは一種の「安全なコード」を作り出すことができます。 – Lostblue

関連する問題