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

sat*_*ttu -1 oracle stored-procedures

  1. 使用 user1 创建存储过程并将执行权限授予 user2。

    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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用 user2 执行存储过程。它成功删除了行。

    login user2
    
    DEL_ROWS('arg');
    
    //success
    
    logout user2
    
    Run Code Online (Sandbox Code Playgroud)
  3. 向表中插入一些行

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

    login user2
    DEL_ROWS('arg');
    
    //does not delete rows
    
    Run Code Online (Sandbox Code Playgroud)
  5. 如果我再次分配 GRANT EXECUTE,它会删除这些行。

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

Wes*_*ger 5

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

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

在步骤 3 中以用户 1 身份插入行后尝试运行该commit;命令(如果您尚未运行)。另外,请select count(*) from table;以用户 2 的身份尝试执行步骤 4 中的查询,看看用户 2 是否确实看到了可以删除的任何行。