1


0

トリガーとFK制約で計算されたレコードのテーブルを維持することには、どのような欠点がありますか?

ロールを含むテーブルがあります。 多くのユーザーを役割に割り当てることができます。 パーミッションをロールに割り当てて、そのロールへのすべてのユーザーにパーミッションを付与できます。

500人の人がいるロールにアクセス許可を割り当てると、500個のアクセス許可の割り当てが事実上作成されました。

ロールに割り当てられた各アクセス許可で、そのロールを持つ各個人がどのタイプのアクセス許可を持っているかを判断するときに実行する必要がある複雑な計算を指定します。 たとえば、「READ_EMAIL」権限を「ACCOUNTANT」ロールに割り当てる場合、許可するメールボックスタイプを指定する変数も含めます。複数のメールボックスタイプがあり、会計士は特定のグループへのアクセス。

だから、どの個人がどの特定のメールボックスにアクセスできるかを知りたいときは、アクセス許可、役割、およびユーザーテーブルに参加するだけでなく、ここで説明するのが難しい理由のために検索を行う必要があります消費し、高速化することはできません。

私が遭遇する問題は、計算されたすべての許可の割り当てをビューに公開するとき(すべてのテーブルを結合し、複雑で時間のかかる計算を行う)、非常に長い時間がかかることです。

ユーザーにロールを割り当てたり、ロールにアクセス許可を割り当てたりすることでアクティブ化されるトリガーを使用して、ユーザーロール許可テーブルを簡単に作成できることがわかりました。 権限がロールに割り当てられるたびに、そのロールを持つ個人ごとにレコードが挿入され、その時点で複雑な検索が実行され、500レコードがこのテーブルに入れられます。 ユーザーがロールに割り当てられると、パーミッションと複雑なルックアップが生成されます。 このテーブルからロール割り当てテーブルおよび権限割り当てテーブルへの外部キーがあり、カスケード削除があります。

役割の割り当てへのアクセス許可はまれなので、それが大幅に遅くなれば大丈夫です。 テーブルへのアクセスの99.99999%はSELECTです。

この方法の欠点はありますか? リアルタイムのデータが必要です。 コミット時のマテリアライズドビューを自分で設計しているだけですか? 他に何か提案はありますか?

1 Answer


2


コミット時のマテリアライズドビューを独自に設計しているように聞こえます。 結果をキャッシュするために、ここでコミット時のマテリアライズドビューを使用することができない理由はありますか?

マテリアライズドビューの更新に失敗すると、トランザクションのコミット操作が失敗し、強制的にロールバックされます。 そのため、データとマテリアライズドビューが同期しなくなることは実際にはありません。 トリガーベースのソリューションがバグになる可能性は確かにはるかに高くなります(特に、複数のセッションで同時に変更が行われる場合)。 同期ロジックの記述はOracleに任せたいと思います。