2

PeopleSoft クエリ (Oracle バックエンド データベースを使用) で問題に直面しています。複数のレコードを含むかなり複雑なクエリがユーザーによって設定されると、PS はセキュリティ レコードの結合を強制するため、次のような SQL が生成されます。

select .... from
ps_job a, PS_EMPL_SRCQRY a1, ps_table2 b, ps_sec_rcd2 b1, ps_table3 c, ps_sec_rcd3 c1
ここで、(...セキュリティは a->a1、b->b1、c->c1...) および ( ...a、b、c の結合...) および
a.setid_dept = 'XYZ';

(最後の条件の選択性が高く、列にインデックスがあると仮定します)明らかに、条件の配置により、最初に巨大な結合が作成され、一時セグメントに書き込まれ、最後の条件が最終的に適用されると、小さなサブセットのみが選択されます。このように定式化されたクエリは、APPSRV や QRYSRV の事前設定されたタイムアウトに達する可能性が非常に高くなります。手動でクエリを作成するときは、最も選択的な条件を最初に移動して、処理されるデータの量をかなりのレベルに制限します。
PS をこのように動作させる方法についてのアイデアはありますか? 実際、すでに「Oracle スタイルの」SQL を ANSI SQL に書き直していて、クエリが高速化されているようですが、PS は Oracle スタイルのクエリを記述しています...

よろしくお願いし
ます DBa

4

2 に答える 2

2

Grant が提案したこととは別に、別の方法は、ユーザーがクエリを実行して通常の結合を実行するテーブルにビューを作成することです。

1. クエリで使用されるレコードごとにビューを作成します。2. ビューをクエリ セキュリティ ツリーに追加します。3. PS クエリでビューを使用します。これにより、ビューに対して通常の結合が実行され、結合にセキュリティ レコードはありません。

ユーザー レベルのセキュリティをデータに適用するには、別のセキュリティ ビューを作成して最終的なクエリに結合し、現在ログインしているユーザーをチェックする where 句に条件を設定します。

この方法では、ユーザー クエリごとにビューを作成するのではなく、固定数のビューを作成できます。

于 2012-05-12T09:46:38.770 に答える
1

私が知っている唯一の解決策は、結合を本来の方法ではなく、本来の方法で強制的に実行する (そして恐ろしいマージ結合デカルトを回避する) ことです。それは、結合を正しく行うビューを作成することです。

  • 正しいフィールドでレコードを作成します。
  • タイプ SQL ビューにします。
  • 動作するようになった SQL を貼り付けます。
  • クエリ セキュリティ ツリーに追加します。
  • セキュリティ キャッシュを更新します。
于 2010-03-19T22:17:42.493 に答える