为什么每次都需要对存储过程执行GRANT EXECUTE ON?

时间:2018-08-06 23:56:12

标签: oracle stored-procedures

  1. 使用user1创建存储过程,并将执行授予用户2。

    login with user1
    
    CREATE OR REPLACE PROCEDURE DEL_ROWS (arg IN VARCHAR2 )  AS
    BEGIN
        //delete rows
    END DEL_ROWS;
    
    GRANT EXECUTE ON DEL_ROWS TO USER2;
    
    logout user1
    
  2. 使用user2执行存储过程。它成功删除了行。

    login user2
    
    DEL_ROWS('arg');
    
    //success
    
    logout user2
    
  3. 在表中插入一些行

     login user1
     insert some rows in the table
     logout user1
    
  4. 再次使用user2执行存储过程。这次,不删除行。

    login user2
    DEL_ROWS('arg');
    
    //does not delete rows
    
  5. 如果我再次分配GRANT EXECUTE,它将删除行。

在授予执行权限时我缺少什么吗?

1 个答案:

答案 0 :(得分:4)

我怀疑您在第3步中插入行时没有提交事务。

在步骤5中从用户1调用GRANT EXECUTE时,这将算作DDL。 DDL在完成后自动提交事务,因此可能是行插入DML仅在该点提交。

在以用户1的身份在步骤3中插入行之后,尝试运行commit;命令(如果还没有的话)。另外,以用户2的身份尝试在步骤4中进行select count(*) from table;查询,以查看用户2是否实际看到它可以删除的任何行。