私の雇用者アプリケーションの多くは、データを特定のユーザーまたはグループのセットに制限するための同様の内部許可構造を共有しています。グループは入れ子にすることもできます。
このアプローチで現在直面している問題は、アクセス許可の列挙が非常に遅いことです。現在の方法では、多くのカーソルと一時テーブルを持つストアド プロシージャを使用しています。これは小規模なアプリケーションでは問題なく機能しましたが、現在、急速に成長している特定のシステムが 1 つあり、速度が低下し始めています。
基本的なテーブル構造は次のとおりです。
tblUser { ユーザー ID、ユーザー名、WindowsLogonName }
tblGroup {グループID、名前、説明、システムフラグ}
tblGroupGroup { GroupGroupID, 名前, }
tblGroupUser { GroupUserID, 名前, }
そしてそれをすべて結びつけます。
tblPermission { PermissionID、SecurityObjectID、SecuredID、TableName、AllowFlag }
..のような行が含まれています
'5255-5152-1234-5678', '{グループの ID}', '{tblJob 内の何かの ID}', 'tblJob', 1
'4240-7678-5435-8774', '{ユーザーの ID}', '{tblJob 内の何かの ID}', 'tblJob', 1
'5434-2424-5244-5678', '{グループの ID}', '{tblTask 内の何かの ID}', 'tblTask', 0
すべてのグループを列挙し、保護された行の ID を取得するためのより効率的な方法が必要ではないでしょうか?
事態をさらに複雑にします。ユーザーが行へのアクセスを明示的に拒否されている場合、これはすべてのグループ権限を無効にします。これはすべて MSSQL にあります。