1

SQL Server の外部キーにカスケード削除を追加する際に問題が発生しています。テーブル A には 3 つの列があります。テーブル A の列 1 と 2 は、テーブル B の同じ列への外部キー ルックアップです。これらの外部キーに基づいてテーブル A の行の削除をカスケードするために、テーブル B の行の削除が必要です。

テーブル A の他の列には、テーブル C への外部キー ルックアップがあります。テーブル C の行が削除された場合、テーブル A で対応するセルを null に設定する必要があります。

これらの制約を追加すると、エラーがスローされます。

テーブル 'RelatedDeliverableUnit' に FOREIGN KEY 制約 'FK_RDU_TODELIVERABLEUNITREF' を導入すると、サイクルまたは複数のカスケード パスが発生する可能性があります。ON DELETE NO ACTION または ON UPDATE NO ACTION を指定するか、他の FOREIGN KEY 制約を変更します。

私はこれに少しこだわっています.Oracleはこのロジックに完全に満足しているようです. Liquibase を使用してこれらの制約を追加しています。エラーは構文ではなくロジックによるものだと思いますが、完全を期すために、外部キーを管理する Liquidbase スクリプトを次に示します。

    <addForeignKeyConstraint constraintName="FK_RDU_FROMDELIVERABLEUNITREF" baseTableName="relatedDeliverableUnit"
                             baseColumnNames="FROMDELIVERABLEUNITREF" referencedTableName="DELIVERABLEUNIT" referencedColumnNames="DELIVERABLEUNITREF" onDelete="CASCADE"/>

    <addForeignKeyConstraint constraintName="FK_RDU_TODELIVERABLEUNITREF" baseTableName="relatedDeliverableUnit"
                             baseColumnNames="TODELIVERABLEUNITREF" referencedTableName="DELIVERABLEUNIT" referencedColumnNames="DELIVERABLEUNITREF" onDelete="CASCADE"/>                        

    <addForeignKeyConstraint constraintName="FK_RDU_RELATIONSHIPREF"
                             baseTableName="relatedDeliverableUnit" baseColumnNames="RELATIONSHIPREF" referencedTableName="RELATIONSHIPTYPES" referencedColumnNames="RELATIONSHIPREF" onDelete="SET NULL"/>                      

助けてくれてありがとう

4

1 に答える 1

2

それ以降のバージョンの対応するドキュメントは見つかりませんが、SQL Server 2000 BOLはこの問題に対処しています。

単一の DELETE または UPDATE によってトリガーされる一連のカスケード参照アクションは、循環参照を含まないツリーを形成する必要があります。DELETE または UPDATE の結果として生じるすべてのカスケード参照アクションのリストに、テーブルを複数回表示することはできません。カスケード参照アクションのツリーには、特定のテーブルへの複数のパスがあってはなりません。NO ACTION が指定されているか、デフォルトであるテーブルに遭遇すると、ツリーのブランチは終了します。

それ以降のバージョンでは、これは変更されていません。あなたはこれに反しています:

カスケード参照アクションのツリーには、特定のテーブルへの複数のパスがあってはなりません

これを達成するために私が知っている唯一の方法は、を使用するのINSTEAD OFではなく、トリガーを使用して B と A の間のカスケードの 1 つを実装することON DELETE...です。

テーブル A と C の間の関係は、これによって影響を受けることはありません。


( 2008 BOL )

于 2012-10-08T09:23:46.590 に答える