0

質問は少し奇妙かもしれません。しかし、ユーザーがコメントした場合にのみテーブルの更新が許可される方法を探しています。コメントは、通常のテーブルを更新するときに 2 番目の監査テーブルに保存する必要があります。
「テーブルセットの更新...」を実行するときに、ユーザーがコメントを与える方法はオラクルにはないと思います。

そこで、ユーザーがステートメントとコメントをパラメーターとして渡すことができる独自のプロシージャーを作成します。この手順を行わない更新は、トリガーによって防止されます。

create or replace
    PROCEDURE Update_Table(stmt varchar2, comment varchar2) AS 
    BEGIN
        Insert into audit_table values(stmt, comment);
        Execute immediate stmt;
END Update_Table;

私はこの解決策に本当に満足していません。したがって、もっと簡単な解決策があるかもしれません。

4

1 に答える 1

5

UPDATE標準的なアプローチは、ユーザーがベーステーブルに対してステートメントを発行できないようにすることです。通常は、特権を取り消してから、ユーザーに使用する特権を付与するストアドプロシージャ(おそらく、そのテーブルUPDATEのような他の種類のDML操作を実行するプロシージャと一緒にパッケージ内)を作成します。INSERT次に、ユーザーはストアドプロシージャを呼び出してコメントを渡し、ストアドプロシージャは、実際にテーブルを更新する前に、必要な検証を実装します。

何らかの理由でユーザーに明示的なUPDATEステートメントを発行する機能を本当に提供する必要がある場合、ステートメントを発行する前にストアドプロシージャを呼び出すようにユーザーに要求できますUPDATEか?その場合、コメントのパッケージレベルの変数とコメントを設定するプロシージャを使用してパッケージを作成し、このパッケージレベルの変数からデータを読み取るトリガーをテーブルに作成し、そうでない場合は例外をスローすることができます。設定し、必要なロギングを実行します。

もう1つのオプションは、実際にcomment列をテーブル自体に追加して、最後の変更のコメントを格納し、コメントを別のテーブルに書き込むステートメントレベルのトリガーと、テーブルに設定を強制する制約を作成するcommentことです。

また、@ a_horse_with_no_nameが示すように、テーブルへのアクセスを取り消し、comment列を含むビューを作成してからINSTEAD OF UPDATE、ステートメントが列を適切な値に設定しているかどうかを確認するトリガーを記述commentし、ベースに対して適切なDMLを発行することもできます。テーブル。

于 2013-02-20T19:15:37.450 に答える