2010-06-02 14 views
3

根據用戶名「my_admin可以」時收到的錯誤,我已經成功地創建了一個名爲「通知」表和稱爲「V_NOTIFICATIONS」視圖。在'V_NOTIFICATIONS'視圖中,我已經成功創建了一個觸發器和一個包,它將用戶試圖插入視圖並將其插入到表中。當用戶嘗試在視圖上執行更新和刪除功能時,'V_NOTIFICATIONS'觸發器和程序包也會在表上執行更新和刪除功能。「ORA-01031:權限不夠」插入到一個視圖

我已經這樣做了,在這個項目很多意見,我目前的工作,因爲很多觀點試圖插入一條記錄這個觀點我收到「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;

PACKAGE:

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);
+1

是否可以將數據插入視圖?不這麼認爲。 – Tom 2010-06-02 19:49:32

+1

你可以,但只有在某些條件下(例如,視圖不是一對多的連接,或者存在一個不是觸發器的) – MJB 2010-06-02 19:52:36

+0

聽起來像對我來說太複雜了。您是否知道存儲過程封裝了訪問,因此您可以授予執行插入/更新過程的執行權限,以執行操作而不授予對錶的訪問權限? – 2010-06-02 19:55:39

回答

5

因爲無法插入到DUAL中,因此INSERT進入視圖失敗。不只是你,而是任何人。嘗試

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

看看會發生什麼。

分享和享受。

+0

謝謝。我不明白,即使我已經通過觸發器重新路由了插入,甲骨文會將此視爲試圖插入到Dual中。 – 2010-06-08 15:40:53

+0

@Patrick:我預計,甲骨文檢查權限能夠通過視圖激活觸發器,這有一定道理之前插入 - 如果有問題的用戶不具有對視圖的權限沒有用點火觸發 - 但在這種情況下, DUAL出現混亂的事情。 – 2010-06-08 16:09:01

0

「我能夠直接插入使用相同的代碼,在包表,但不是到視圖中。 「

如果您直接調用包(即不通過觸發器間接調用),它是否工作?

如果沒有,那麼你可以忽略事物的看法/觸發面,集中在包裝上。一般來說,如果你可以直接運行SQL,但不能通過包運行,那是因爲你有一個授予你使用權限的角色。存儲的PL/SQL沒有角色特權。

如果程序包確實有效,那麼用戶可能沒有在視圖上擁有插入權限。這可能有些奇怪,就像觸發器沒有包的特權一樣,但這可能是一個編譯錯誤,除非它使用動態SQL。

在包裝上INVOKER權利也可能有效果,因爲這將意味着它與觸發所有者,而不是包所有者的權限運行。觸發所有者可能是視圖的所有者,但可能與表的所有者不同。

+0

當我直接調用包時,它可以工作。 另外,MY_ADMIN用戶(這是我連接的用戶)是包,觸發器,視圖和表的所有者,所以我應該擁有所有權限,因爲我已授予MY_ADMIN的所有權限。 – 2010-06-03 16:42:00