2010-06-02 19 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