0

私は、階層スタイルの管理を使用してツリーとして編成された顧客のリストを持つビジネス管理システムを開発しています。

Customer A
  -- Customer B
    -- Customer C
  -- Customer D

すべての顧客データ (名前、連絡先情報など) を格納するテーブルと、このツリーの関係をマップする別のテーブルがあります。

CREATE TABLE customer_tree
(
 "fromID" int, 
 "toID" int, 
 CONSTRAINT "fk_from_tree_customer" FOREIGN KEY (fromID) REFERENCES CustomerNode(id), 
 CONSTRAINT "fk_to_tree_customer" FOREIGN KEY (toID) REFERENCES CustomerNode(id), 
 "id" int IDENTITY(1,1) PRIMARY KEY)

基本的に、fromID は親ノードであり、toID はその子の 1 つの ID であり、子ノードごとに行を挿入します。

今、私がやっている問題は、このテーブルを更新し続けることです。顧客を削除するたびに、このテーブルの関係も削除したいと思います。次のようなものを使用してカスケードを使用してテーブルを作成しようとしました:

 ... FOREIGN KEY (fromID) REFERENCES CustomerNode(id) ON DELETE CASCADE, 
 ... FOREIGN KEY (toID) REFERENCES CustomerNode(id) ON DELETE CASCADE

しかし、現在許可されている循環参照が発生するため、データベースはこのテーブルの作成を許可しません。ツリー構造はコードで循環ノードをチェックされるため、実際の循環は問題になりません。ただし、ノードを削除するたびに、この関係を自動的に削除したいと考えています。

これを達成したり、循環参照チェックを回避したりする簡単な方法はありますか?

御時間ありがとうございます!

4

2 に答える 2

1

CUSTOMER テーブルで削除操作のトリガーを作成できます。

このトリガーでは、対応する顧客が顧客の削除と同じである customer_tree テーブルから削除できます。

以下のようにトリガーロジックを構築できます-

CREATE TRIGGER ON Customer
  BEFORE DELETE    
BEGIN
  DELETE FROM Customer_Tree Ct
   WHERE Fromid IN (SELECT Id FROM Deleted)
      OR Toid IN (SELECT Id FROM Deleted)
END
GO

私は実際にはSQL Serverが苦手ですが、MSDN側からこのキーワードを見つけました。

参照

于 2013-05-20T12:37:48.937 に答える
0

私の経験から言えば、答えはノーです。コードから行う必要があります。代わりに、SQL Serverのhierarchyidデータ型を使用して調査できます。

于 2013-05-20T12:10:01.507 に答える