4

尝试在 Oracle 11 存储过程中放置​​ GRANT 语句时,它报告 GRANT 是一个意外符号。GRANT 是否需要以某些东西开头,还是 Oracle 只是不允许在 SP 内运行 GRANTS?

4

2 回答 2

5

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

您将不得不使用动态SQL( EXECUTE IMMEDIATE) 来执行此操作,但老实说,我不明白您为什么要在存储过程中执行此操作。

于 2011-03-22T16:05:46.383 回答
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 语句。出于安全原因,Web 应用程序以“appuser”的身份连接,它只有有限的系统权限。

这既是问题的解决方案,也是解决方案的可靠用例。

于 2013-01-21T17:31:37.880 回答