【问题标题】:Can GRANT be used inside an Oracle Store Procedure?可以在 Oracle 存储过程中使用 GRANT 吗?
【发布时间】:2011-07-20 15:08:42
【问题描述】:

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

【问题讨论】:

    标签: oracle stored-procedures grant


    【解决方案1】:

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

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

    【讨论】:

    • 和往常一样,应该注意的副作用是 DDL 执行隐式 COMMIT。
    • @DCookie: yes and 1525 更多副作用,我试图将其概括为“坏主意”。
    • 它是用于运行 dbms 命令的管理脚本,具有如此多的权限,不能经常运行或由多个用户运行。有没有更好的方法来解决这样的问题?
    • @MikeS:当然,只需将其作为普通查询运行,而不将其包装到存储过程中。
    【解决方案2】:

    这是一个 PL/SQL 存储过程,它将当前用户拥有的所有表的对象权限(SELECT、UPDATE 等)授予另一个用户,例如- “应用用户”。

    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 应用程序只有有限的系统权限。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-03
      • 2011-11-12
      • 2016-03-30
      • 2012-03-08
      相关资源
      最近更新 更多