GRANT可以在Oracle存储过程中使用吗?

时间:2011-03-22 16:02:39

标签: oracle stored-procedures grant

尝试在Oracle 11存储过程中放置​​GRANT语句时,它会报告GRANT是意外的符号。 GRANT是否需要以某种形式开头,或者Oracle是否仅仅禁止在SP中运行GRANTS?

2 个答案:

答案 0 :(得分:4)

在存储过程中使用DDL(如GRANT)是个坏主意。

您必须使用动态SQLEXECUTE 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应用程序,出于安全原因,它只具有有限的系统权限。

这既是问题的解决方案,也是解决方案的坚实用例。