尝试在Oracle 11存储过程中放置GRANT语句时,它会报告GRANT是意外的符号。 GRANT是否需要以某种形式开头,或者Oracle是否仅仅禁止在SP中运行GRANTS?
答案 0 :(得分:4)
在存储过程中使用DDL
(如GRANT
)是个坏主意。
您必须使用动态SQL
(EXECUTE IMMEDIATE
)来执行此操作,但老实说,我不明白您为什么要在存储过程中执行此操作。
答案 1 :(得分:2)
这是一个PL / SQL存储过程,它将当前用户拥有的所有表的对象权限(SELECT,UPDATE等)授予另一个用户,例如: - “appuser”。
CREATE OR REPLACE PROCEDURE grant_privs
IS
CURSOR ut_cur IS SELECT table_name from user_tables;
ut_rec ut_cur%rowtype;
BEGIN
FOR ut_rec IN ut_cur
LOOP
EXECUTE IMMEDIATE 'GRANT ALL ON ' || ut_rec.table_name || ' TO appuser';
END LOOP;
END;
/
在为Web应用程序部署数据库更改后,它自动执行。当前用户拥有数据库表。部署任何数据库更改后,执行存储过程以确保“appuser”可以在所有表上运行SQL语句。作为“appuser”连接的Web应用程序,出于安全原因,它只具有有限的系统权限。
这既是问题的解决方案,也是解决方案的坚实用例。