アプリ版:「スタンプのみでお礼する」機能のリリースについて

Sqlserver2005でテーブルを作成してい分からなかったので質問します。
[テーブルA]
 {フィールド1}主キー
  (データ1000)
  (データ1001)
  (データ1002)
これを親とするテーブルBを作成して
[テーブルB]
 {フィールド1}主キー{フィールド2}主キー
 (データ1000)   (データ1001)
 (データ1001)   (データ1002)
 (データ1002)   (データ1003)
[テーブルB]の{フィールド1と2}を[テーブルA]の
{フィールド1}にリーレーションを張って
[テーブルA]の{フィールド1}のデータが消した時に[テーブルB]の{フィールド1,2}
のデータ、どちらかに該当するデータがあった場合に行ごと削除したいので
{フィールド1,2}のリレーションシップの設定の「DeleteRule」を2つとも「重ねて表示」としたいのですが
「パスが循環するか、複数のパスに連鎖する可能性があります。ON DELETE NO ACTION、ON UPDATE NO ACTION、を指定するか、他の FOREIGN KEY 制約を変更してください。
制約を作成できませんでした。以前のエラーを調べてください。」
と表示されて出来ませんこの場合フィールド1,2どちらか1つのフィールドしか
DeleteRule「重ねて表示」に設定できないのでしょうか?

こういう風に分岐する道筋を明記するテーブルを作りたいのですが
1━┳2
   ┗3  
自分の作ったテーブルの構造が良くないかもしれないので上に書いてあるような
テーブルでは駄目だという方もどういったテーブル構造が良いのか教えて欲しいです

A 回答 (1件)

http://technet.microsoft.com/ja-jp/library/ms186 …

>1 回の DELETE または UPDATE 操作によって起動される連鎖参照動作は、循環参照を含まないツリー形式になっている必要があります。DELETE または UPDATE 操作によって生じる一連の連鎖参照動作の影響を複数回受けるテーブルがあってはいけません。

上記に反することから、このケースはCASCADEできないと考えられます。
したがって、外部参照制約だけで表現することはできません。仕様だから仕方がありません。
代替案としては、参照元のテーブルAには通常の外部参照制約だけを掛け(ON DELETE NO ACTION)、削除されたときの動きはINSTEAD OFトリガで実装することになると思います。

テーブルのデザインで回避したいというならば、テーブルBにテーブルAを参照する複数のキー項目を持たせないようにするしかありません。
(マッピングIDでも持たせて2行で収録するとかです)

この回答への補足

ALTER TRIGGER Trigger2 ON [テーブルA]
INSTEAD OF Delete
AS
Begin

DELETE From [テーブルB]
Where [テーブルB].{フィールド1} = (SELECT [テーブルA].{フィールド1} From Deleted)
OR [テーブルB].{フィールド2} = (SELECT [テーブルA].{フィールド1} From Deleted)

DELETE From [テーブルA] Where [テーブルA].{フィールド1} = (SELECT Img_Hash From Deleted)

End

いろいろ調べてこういう風に書くと上手くいきましたありがとうございます。

補足日時:2010/06/01 19:46
    • good
    • 0
この回答へのお礼

回答ありがとうございます。とりあえず今のやり方では出来ない事が分かったので
モヤモヤが取れました。INSTEAD OFトリガで削除する方法でやってみたいと思います。

お礼日時:2010/06/01 15:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す