質問者
クロステーブルのリレーションシップで連鎖更新を設定する

質問
-
いつもお世話になります。
普段はMS-Accessを使用していて、最近Azure上のMicrosoft SQL Server Web (64-bit)を使用し始めたユーザーです。
今日は、Microsoft SQL Server Web (64-bit)に、SQL Server Management Studio2014を介して、アクセスして操作しています。先の質問(https://social.msdn.microsoft.com/Forums/ja-JP/c4f42a66-242f-46f2-93ab-308d4af1d6f1)で、
リレーションシップで、MS-Accessの「連鎖更新」と、SQL Serverの「更新ルール:重ねて表示」は、同じものであると理解しました。
ありがとうございました。重ねての関連質問になるのですが、前の質問より深い内容なので、別スレッドにさせていただきます。
簡単のため2つのテーブルを持つデータベースです。
テーブルAAA : IDというint型の主キーだけをもつテーブルです。
テーブルBBB : 2つのint型のフィールドをもつ、テーブルAAAのクロステーブルです。MS-Accessの場合
のようにリレーションシップを定義して、それぞれに連鎖更新を設定することができます。これと同じことをSQL Serverでやりたいのですが、SQL Server Management Studio2014を介して、
テーブルBBBのふたつのフィールドのリレーションシップにそれぞれ「更新ルール:重ねて表示」を設定して、保存しようとすると、======================================
テーブル 'AAA' は正常に保存されました
テーブル 'BBB'
- リレーションシップ 'FK_BBB_AAA1' を作成できません。
テーブル 'BBB' に FOREIGN KEY 制約 'FK_BBB_AAA1' を設定すると、パスの循環や複数のカスケード パスが生じる可能性があります。ON DELETE NO ACTION、ON UPDATE NO ACTION、を指定するか、他の FOREIGN KEY 制約を変更してください。
制約またはインデックスを作成できませんでした。以前のエラーを調べてください。======================================
というエラーでテーブルBBBが保存できません。
問題の原因は、MS-Accessの場合にリレーションシップ先にテーブルAAAの別名(AAA_1)を使わなくてはならないことと同一だと思われますが、SQL Server Management Studioの場合に同じことをどのようにしたらよいのかが分かりません。
ちなみに、SQL Server Management Studioから出てくる保存用のSQLスクリプトは、次のようなものでした。
/* データ損失の問題を防ぐため、データベース デザイナーのコンテキスト外でこのスクリプトを実行する前に、スクリプトの詳細を確認してください。*/ BEGIN TRANSACTION SET QUOTED_IDENTIFIER ON SET ARITHABORT ON SET NUMERIC_ROUNDABORT OFF SET CONCAT_NULL_YIELDS_NULL ON SET ANSI_NULLS ON SET ANSI_PADDING ON SET ANSI_WARNINGS ON COMMIT BEGIN TRANSACTION GO ALTER TABLE dbo.AAA SET (LOCK_ESCALATION = TABLE) GO COMMIT BEGIN TRANSACTION GO ALTER TABLE dbo.BBB ADD CONSTRAINT FK_BBB_AAA FOREIGN KEY ( A ) REFERENCES dbo.AAA ( ID ) ON UPDATE CASCADE ON DELETE NO ACTION GO ALTER TABLE dbo.BBB ADD CONSTRAINT FK_BBB_AAA1 FOREIGN KEY ( B ) REFERENCES dbo.AAA ( ID ) ON UPDATE CASCADE ON DELETE NO ACTION GO ALTER TABLE dbo.BBB SET (LOCK_ESCALATION = TABLE) GO COMMIT
よろしくお願いします。
- 編集済み hiroshi.tsuchida 2017年4月19日 7:47
すべての返信
-
単一テーブルの要素どうしが多対多で結合してるってことですよね?
自信はないですが、2重のカスケードは出来ないに一票。
Accessでは出来るってことに驚きました。- 回答としてマーク hiroshi.tsuchida 2017年4月24日 19:45
- 回答としてマークされていない hiroshi.tsuchida 2017年4月24日 19:54