2016-03-08 29 views
0

当调用应创建视图的过程时,它将返回“权限不足”。我可以使用SQL命令本身创建视图,但不能在运行该过程时创建视图。所有完成的操作都在架构所有者中。请让我知道如何解决这个问题。oracle在使用过程创建视图时不足的特权

/* 1. FIRST, I LOGON TO MY OWN SCHEMA, CALLED 'MY_SCHEMA' */ 
/* (IF YOU WANT TO USE A DIFFERENT ONE, JUST REPLACE THE TEXT MY_SCHEMA WITH YOUR OWN SCHEMA NAME) */ 

/* 2. DROP THE EXAMPLE TABLE IF IT ALREADY EXISTS */ 
DECLARE TBL_COUNT INT; 
BEGIN 
    SELECT COUNT(*) INTO TBL_COUNT FROM ALL_TABLES WHERE OWNER = 'MY_SCHEMA' AND TABLE_NAME = 'EXAMPLE'; 
    IF TBL_COUNT > 0 THEN 
    EXECUTE IMMEDIATE('DROP TABLE "MY_SCHEMA"."EXAMPLE"'); 
    END IF; 
END; 
/
-- Result : Done 

/* 2. CREATE THE EXAMPLE TABLE */ 
CREATE TABLE MY_SCHEMA.EXAMPLE 
(
    COL1 INTEGER 
); 
-- Result : Done 

/* 3. THEN, CREATE A VIEW IN MY OWN SCHEMA, WHICH POINTS TO THE TABLE IN MY OWN SCHEMA */ 
CREATE OR REPLACE VIEW MY_SCHEMA.VW_EXAMPLE AS SELECT * FROM MY_SCHEMA.EXAMPLE; 
-- Result : Done 

/* 4. DROP THE VIEW, JUST FOR ARGUMENT'S SAKE */ 
DROP VIEW MY_SCHEMA.VW_EXAMPLE; 
-- Result : Done 

/* 5. NOW CREATE A PROCEDURE IN MY OWN SCHEMA, WHICH CREATES A VIEW IN MY OWN SCHEMA, WHICH POINTS TO A TABLE IN MY OWN SCHEMA */ 
CREATE OR REPLACE PROCEDURE MY_SCHEMA.PRC_EXAMPLE AS 
BEGIN 
    EXECUTE IMMEDIATE 'CREATE OR REPLACE VIEW MY_SCHEMA.VW_EXAMPLE AS SELECT * FROM MY_SCHEMA.EXAMPLE'; 
END; 
-- Done 

/* 6. LET'S CALL THE PROCEDURE FROM MY OWN SCHEMA, WHICH SHOULD CREATE THE VIEW IN MY OWN SCHEMA, POINTING TO A TABLE IN MY OWN SCHMEA */ 
BEGIN 
    MY_SCHEMA.PRC_EXAMPLE; 
END; 
-- ORA-01031 : Insufficient privileges 
+0

您的DDL权限是通过角色授予的,而不是直接授予您的用户?为什么你想要无时间地创建对象atr - 通常应该静态地维护模式。 –

回答

0

用户MY_SCHEMA有什么特权?

仅限内部程序(或PL/SQL块)直接授予权限适用。按角色授予的权限(例如,角色DBARESOURCE)不适用于过程或PL/SQL块内。

+0

如果我理解正确,即使该过程是由MY_SCHEMA在MY_SCHEMA中创建的,并仅适用于MY_SCHEMA中的对象,那么需要设置更多特权?我需要设置哪些对象或哪些操作来设置特权?我如何设置这些特权? –

+0

您需要特权'CREATE VIEW'。你可以通过'GRANT CREATE VIEW TO MY_SCHEMA'来获得它;' –

+0

我可以从哪个模式授予此特权?当我执行GRANT CREATE VIEW TO MY_SCHEMA时;在我的模式中,它也表示特权不足。 –