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

  • 質問

  • いつもお世話になります。

    普段は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の場合
    テーブルAAAとBBBのリレーションシップの設定
    のようにリレーションシップを定義して、それぞれに連鎖更新を設定することができます。

    これと同じことを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

    よろしくお願いします。


    2017年4月19日 7:42

すべての返信

  • 単一テーブルの要素どうしが多対多で結合してるってことですよね?
    自信はないですが、2重のカスケードは出来ないに一票。
    Accessでは出来るってことに驚きました。
    2017年4月19日 8:30
  • hihijijiさま

    回答ありがとうございました。お返事が遅くなり、すみません。

    AccessのDBでは普通に連鎖更新させて運用して、よく使う機能です。

    SQLサーバーユーザーの皆さんには、このような連鎖更新の需要はないのかしら?

    テーブルAAAのIDを修正すると、テーブルBBBの内容が自動的に書き換わってくれるという連鎖更新を求めています。

    2017年4月24日 19:54