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