0

メニューのメタデータを管理する小さなアプリを作成しています。AMenuは に接続され、App(オプションで) 別の にも接続されますMenu(したがって、サブメニューを定義します)。したがって、接続は次のようになります: に接続Menu.AppIdApp.Id、次にMenu.ParentIdに接続しMenu.Idてサブメニューを定義します。

しかし、これにより、一貫性のないデータを挿入できます。

INSERT INTO Menu (Id, ParentId, AppId, Desc) values (1, NULL, 25, 'Top Menu')
INSERT INTO Menu (Id, ParentId, AppId, Desc) values (2, 1, 36, 'Sub Menu')

ここで、アプリ#36のサブメニューは、アプリ#25 (別のアプリ)のトップ メニューの下にある必要があると述べました。

Sub MenuをTop Menuの子として挿入するときに、アプリを #25 にする必要があることを確認する制約を定義する方法はありますか (トリガーはオプションではありません)。

(もちろん、これはユーザー インターフェイスで管理しますが、モデルを保護する方法も探しています)。

ありがとうございました、

4

2 に答える 2

0

方法はありますが、appid に null を許可する必要があります。この場合、appid は親にのみ存在します。

create table #temp (parentid int null,  appid int NUll)
ALTER TABLE #temp
ADD CONSTRAINT myconstraint CHECK (parentid+appid = Null and (isnull(parentid, 0)+isnull(appid,0) = parentid  or isnull(parentid, 0)+isnull(appid,0) = appid));

insert #temp
values(1,null)
insert #temp
values(null,1)
insert #temp
values(1,1)

そのような構造がうまくいくかどうかはわかりませんが、機能するチェック制約を考え出すことができる唯一の方法でした。

于 2013-08-20T13:32:17.893 に答える