1

次のような 2 つのテーブルを持つ型指定されたデータセットがあります。

テーブル A (親テーブル)

ID  MessageID   
1     1
2     1
3     2
4      3

表B(子表)

ID  MessageID   
1     1
2     2
3     3

MessageID 列でテーブル A とテーブル B の間に関係があります。デリート ルールは Cascade に設定されます。これらのテーブルのデザインを変更することはできません。

テーブル A には MessageID 1 の 2 つのレコードが含まれています。そのうちの 1 つだけを削除すると、テーブル B から子レコードが削除され、2 番目の親テーブルに孤立が作成されます。MessageID を共有する親レコードが他にない場合にのみ削除する方法はありますか?

4

1 に答える 1

1

たとえば、カスケード削除の代わりにトリガーを作成できます(MS SQL-Server、未テスト):

CREATE TRIGGER [dbo].[trDeleteTableB] ON [dbo].[TableA]
    FOR DELETE
    AS
    DELETE FROM TableB
    WHERE (MessageID IN
         (SELECT MessageID
           FROM  DELETED
           WHERE (NOT EXISTS
                 (SELECT * FROM  TableA
                  WHERE (TableA.MessageID = DELETED.MessageID)))))

別のアイデアは、型指定されたデータセットを拡張することです。機能を拡張したい場合は、DatesetName.designer.cs/vb で生成されたクラスを変更することはできませんが (変更すると再作成されます)、名前にデザイナーのないファイルを変更できます (存在しない場合は作成します)。次に、部分的な DataTable クラスを拡張する必要があります (正確な名前がわからない場合は、デザイナー ファイルを参照してください。通常は fe TableBDataTable です)。

次のコードを見て、私が何を意味するかを確認してください。テストはしていませんが、私の主張を理解していただければ幸いです。

Partial Class Datset1
    Partial Class TableBDataTable
        Private Sub TableB_RowDeleting(ByVal sender As Object, ByVal e As TableBRowChangeEvent) Handles Me.TableBRowDeleting
            If e.Action = DataRowAction.Delete Then
                '*** check here if there is another TableARow with this MessageID ***'
                e.Row.RejectChanges()
            End If
        End Sub
    End Class
End Class
于 2011-05-04T20:26:52.510 に答える