1

大規模な Oracle 本番データベース (10g) で毎日作業していると、次のような操作に気付きました。

  • テーブルに対する読み取り権限をユーザーに付与する
  • テーブルにトリガーを作成する

そのテーブルをロックし、それを主張しているすべてのカーソルを無効にします。

テーブルが大きく (> 2000 万行)、多くのユーザーが作業している場合、これは非常に大きな結果をもたらします。

私の質問は次のとおりです。なぜ Oracle はテーブルをロックしているのですか (結局、構造を変更するのではなく、ユーザーに読み取り権限を与えるだけです)、なぜカーソルを無効にする必要があるのですか?

それらのようなアクションを「よりソフト」にする方法はありますか?

前もって感謝します。

別の質問: 無効化がそのオブジェクトに与える影響を最小限に抑えるために、特定のテーブルで開いているカーソルの数を知る方法はありますか?

4

6 に答える 6

2

一度グループに権限を付与し、その後、直接のテーブル権限ではなく、ユーザーにメンバーシップ権限を付与する場合があります。私は知っているかなり素朴な答えですが、あなたが何をしているのかを知っていて、詳細を把握できるという印象を受けます。

于 2010-06-17T19:17:59.297 に答える
2

付与に基づく無効化の排除:

xxx が適切に意味のある値である xxx_READONLY ロールを作成し、適切なすべてのテーブルへの選択アクセスをロールに付与し、必要なときにユーザーにロールを追加します。

トリガー作成に基づく DDL ロックの排除:

前回実際に確認したとき、トリガーは解釈されたコードでしたが、プロシージャとパッケージはコンパイルされたコードでした。したがって、トリガーで複雑なロジックを実行することは、一般的に嫌われます。トリガー内でプロシージャーまたはパッケージ メソッドを呼び出すことができ、トリガー ロジックをプロシージャーまたはパッケージにカプセル化することで、ベース テーブルに対する DDL ロックを軽減または排除できます。

于 2010-06-28T18:49:28.720 に答える
1

最初の質問は役に立ちませんが、別の方法として、ここここでいくつかの便利なコマンドを見つけました

于 2010-06-28T18:15:15.873 に答える
1

少なくとも新しいトリガーの実行を必要とするアクションにカーソルが使用される可能性がある場合、トリガーを追加するにはロックが必要であり、カーソルを無効にするか、開いているすべてのカーソルが閉じるのを待つ必要があることがわかります。

読み取り権限の付与に同様の要件がある理由を理解するのは難しく、おそらく実装の副作用にすぎません。MJBの答えは、それに対処するためのまともな方法のようです(そして、多くの場合、とにかく良い習慣であり、アクセス権限の管理を簡素化します)。

于 2010-06-22T18:06:00.650 に答える
0

1)テーブルへの読み取りアクセスを許可する私の質問は、なぜテーブルに直接読み取りを許可し、ロールを作成せず、ロールの読み取りをテーブルに許可してから、ユーザーにロールを許可(または削除)するのですか?これにより、付与時のテーブルのロックの問題が解消されます。

2) トリガーはインストール時にテーブルを変更できるため、Oracle はトリガーの作成時にテーブルをロックします。すべての DDL はテーブルをロックし、トランザクションを作成して、いつトリガー (または他の変更) を実行できるかを正確に把握します。これは助成金も同じだと思います。

テーブルからトリガーを継続的に追加/削除している場合は、変更しているコードをトリガーから削除し、別の PL/SQL プロシージャに入れます。その後、必要に応じて手順を更新します。これにより、トリガーが無効になり (再コンパイルが必要になります)、これは自動的に行われます。

Oracle データ ディクショナリの v$ ビューを使用して、特定のテーブルに対して開かれているカーソルを特定する方法があると確信しています。

于 2010-06-28T18:09:40.320 に答える
0

MJB からのグループ化は、グラントの問題に対する最善の回避策です。「トリガー」の問題については、ビジネス ロジックを分離して、特に 2,000 万行以上のテーブルで、魔法の「トリガー」が実行するすべてのことを実行することをお勧めします。 .

于 2010-06-27T00:57:53.553 に答える