sat*_*ttu -1 oracle stored-procedures
使用 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)使用 user2 执行存储过程。它成功删除了行。
login user2
DEL_ROWS('arg');
//success
logout user2
Run Code Online (Sandbox Code Playgroud)向表中插入一些行
login user1
insert some rows in the table
logout user1
Run Code Online (Sandbox Code Playgroud)再次使用 user2 执行存储过程。这次,不删除行。
login user2
DEL_ROWS('arg');
//does not delete rows
Run Code Online (Sandbox Code Playgroud)如果我再次分配 GRANT EXECUTE,它会删除这些行。
授予执行权限时我缺少什么吗?
我怀疑您在步骤 3 中插入行时没有提交事务。
当您在步骤 5 中从用户 1 调用 GRANT EXECUTE 时,这算作 DDL。DDL 在完成后自动提交事务,因此行插入 DML 可能仅在此时提交。
在步骤 3 中以用户 1 身份插入行后尝试运行该commit;命令(如果您尚未运行)。另外,请select count(*) from table;以用户 2 的身份尝试执行步骤 4 中的查询,看看用户 2 是否确实看到了可以删除的任何行。