これは私たちが持っているデータベーススキーマです。T-SQL ResultSetのセットとDBの行セットを一致させるクエリ。Group By columnId
t_RoleCombinations - これらの役割を持つことができる権限のすべての可能な組み合わせです。
t_Permissions_Hierarchy - これはアクセス許可を強制します。例えば、ロールにCreate
のリソースがある場合は、そのリソースにEdit
の権限が必要です。Edit
へのアクセス許可がある場合は、View
へのアクセス許可が必要です。 Share
の許可もあります。割り当てられている場合は、View
の許可も必要です。したがって、役割にCreate
権限がある場合は、それにはView
が含まれている必要がありますが、アクセス許可がShare
ではない可能性があります。このような複雑さのため、t_PermissionsにParentPermissionId列を持つことによって、ツリービュー形式で階層を適用することはできません。その理由は、このt_PermissionHierarchyテーブルを持つ理由です。
t_RoleCombinations_Permissions - これは、アクセス許可のすべての組み合わせを実際に定義するマッピングテーブルです。 t_Permissions
テーブル
t_PermissionsHierarchy
テーブルのサンプル・データ
の
サンプル・データのクライアントは、私はセットを取得するサーバー上で、役割を更新私はtのいずれかと一致する必要があるアクセス許可の彼はt_RoleCombinations_Permissions
テーブルに設定し、それがt_Roles
テーブルに更新されるためにRoleCombinationId
を得る。コンマで区切られたパーミッションのセットの値は、SPを通してパラメータで渡され、必要ならば、stated hereのようなテーブル値の関数でレコードセットにすることができます。
UPDATE: - ソートPermissionIdsカンマ区切り格納するt_RoleCombinationsにVARCHAR(最大)の列を作成する
-I思想。しかし、それはリレーショナルデータベースでは良くありません。
-私が考えることができる文は以下の通りです。しかし、IN
オペレータが論理OR
をチェックし、AND
をチェックしないため動作しません。
SELECT RoleCombinationId from t_RoleCombinations_Permissions
WHERE PermissionId in (1,2,3,4,5) -- my comma saperated permissions
GROUP BY RoleCombinationId
HAVING Count(*) = 5 -- number of permissions specified.