3

ユーザー名「MY_ADMIN」で、「NOTIFICATIONS」というテーブルと「V_NOTIFICATIONS」というビューを正常に作成しました。「V_NOTIFICATIONS」ビューで、ユーザーがビューに挿入しようとしたものを取得してテーブルに挿入するトリガーとパッケージを正常に作成しました。'V_NOTIFICATIONS' トリガーとパッケージは、ユーザーがビューに対して更新および削除機能を実行しようとすると、テーブルに対して更新および削除機能も実行します。

多くのビューが多くの異なるテーブルの上にあるため、現在取り組んでいるプロジェクトの多くのビューでこれを行いましたが、このビューにレコードを挿入しようとすると、「ORA-01031: 権限が不十分です」というエラーが表示されます.

パッケージにあるのと同じコードを使用してテーブルに直接挿入できますが、ビューには挿入できません。これに関するヘルプは大歓迎です。要求されたコードは次のとおりです。

VIEW: (以下の UNION がコメントアウトされている場合、パッケージは期待どおりに実行されます)

CREATE OR REPLACE FORCE VIEW "MY_ADMIN"."V_NOTIFICATIONS" AS
  SELECT N_ID,
    NOTIFICATION_TYPE,
    CASE WHEN NOTIFICATION_DESC = 'C' THEN 'Copy' ELSE 'Send to' END NOTIFICATION_DESC,
    CASE WHEN CONTACT_TYPE = 'D' THEN 'Department' ELSE 'Contact' END CONTACT_TYPE,
    A.AU_USER_ID,
    A.CONTACT_NAME,
    D.DEPARTMENT_ID,
    D.DEPT_DESC
  FROM NOTIFICATIONS AN,
    (SELECT A1.AU_USER_ID,
            AU.FIRST_NAME || ' ' || AU.LAST_NAME CONTACT_NAME
       FROM APP_USERS_CONTACT_INFO A1,
            APPLICATION_USERS AU
      WHERE A1.AU_USER_ID = AU.USER_ID
    /*UNION
     SELECT 0,
            NULL
       FROM DUAL*/) A,
    (SELECT DEPARTMENT_ID, 
            DESCRIPTION DEPT_DESC
       FROM DEPARTMENTS
      UNION
     SELECT 0 DEPARTMENT_ID,
            NULL DEPT_DESC 
       FROM DUAL) D
  WHERE NVL(AN.AU_USER_ID,0)      = A.AU_USER_ID
    AND NVL(AN.D_DEPARTMENT_ID,0) = D.DEPARTMENT_ID;

パッケージ:

CREATE OR REPLACE PACKAGE NOTIFICATIONS_PKG AS

   PROCEDURE INSERT_NOTIFICATION(P_N_ROW V_NOTIFICATIONS%ROWTYPE);

END NOTIFICATIONS_PKG;
/
CREATE OR REPLACE PACKAGE BODY NOTIFICATIONS_PKG AS

   PROCEDURE INSERT_NOTIFICATION(P_N_ROW V_NOTIFICATIONS%ROWTYPE) IS

    L_NOTIFICATION_DESC    VARCHAR2(1);
    L_CONTACT_TYPE         VARCHAR2(1);

   BEGIN

      CASE P_N_ROW.NOTIFICATION_DESC
        WHEN 'Copy' THEN
          L_NOTIFICATION_DESC := 'C';
        ELSE
          L_NOTIFICATION_DESC := 'S';
      END CASE;

      CASE P_N_ROW.CONTACT_TYPE
        WHEN 'Department' THEN
          L_CONTACT_TYPE := 'D';
        ELSE
          L_CONTACT_TYPE := 'C';
      END CASE;

      INSERT INTO NOTIFICATIONS VALUES (
      P_N_ROW.N_ID,
      P_N_ROW.NOTIFICATION_TYPE,
      L_NOTIFICATION_DESC,
      L_CONTACT_TYPE,
      NVL(P_N_ROW.AU_USER_ID, 0),
      NVL(P_N_ROW.DEPARTMENT_ID, 0),
      APP_GLOBAL_PKG.GET_AUDIT);

   END INSERT_AGREEMENT_NOTIFICATION;
END AGREEMENT_NOTIFICATIONS_PKG;

トリガーは、このパッケージに情報を渡して行を挿入するためだけに設定されています。次のコード行を実行しようとすると、ORA-01031 エラーが発生します。

INSERT INTO V_AGREEMENT_NOTIFICATIONS VALUES (5781, 'Collateral Request', 'Send to', 'Contact', 797, '797T', 0, null);
4

2 に答える 2

5

DUAL に挿入できないため、ビューへの INSERT は失敗します。あなただけでなく、誰でも。試す

INSERT INTO DUAL (DUMMY) VALUES ('1')

何が起こるかを見るために。

共有してお楽しみください。

于 2010-06-04T18:14:23.457 に答える
0

「パッケージにあるのと同じコードを使用してテーブルに直接挿入できますが、ビューには挿入できません。」

パッケージを直接 (つまり、トリガーを介して間接的にではなく) 呼び出した場合、機能しますか?

そうでない場合は、ビュー/トリガー側を無視して、パッケージに集中できます。一般に、SQL を直接実行できるが、パッケージを介して実行できない場合は、必要な権限で使用できるロールが付与されているためです。ストアド PL/SQL にはロール権限がありません。

パッケージが機能する場合、おそらくユーザーはビューに対する挿入権限を持っていません。トリガーがパッケージに対する権限を持っていないなど、奇妙なことかもしれませんが、動的 SQL を使用しない限り、コンパイル エラーになる可能性があります。

パッケージに対する INVOKER 権限も影響を与える可能性があります。これは、パッケージ所有者ではなくトリガー所有者の権限で実行されることを意味するためです。トリガーの所有者はおそらくビューの所有者ですが、テーブルの所有者とは異なる場合があります。

于 2010-06-03T02:10:03.973 に答える