如何将Schema中的SELECT授予任何表授予角色(Oracle)

时间:2019-04-05 16:09:28

标签: oracle grant

我们希望在Oracle数据库上创建ANALYTICS角色。担任ANALYTICS角色的任何人都应该能够在一个(或多个)模式(而非所有模式)中的任何视图之间进行选择。

例如,我们有一个名为ARIEL的架构,当我们创建新表和视图时,我们不想一直将GRANTS应用于ANALYTICS角色,因此我们希望有一种方法可以应用授权像这样的“从SCHEMA_X中的所有表上的GRANT SELECT到ANALYTICS” ...请注意ANALYTICS是角色,而不是模式。

我们的数据库管理员说这是不可能的,并且我们将来创建的任何对象都需要应用授权,才能访问ROLE。

2 个答案:

答案 0 :(得分:1)

  

“我们的数据库管理员说这是不可能的,并且我们创建的任何将来的对象都需要应用授权,才能访问ROLE。”

您的DBA是正确的。您正在搜索模式范围特权(尚未实现)。

更多:GRANT SELECT on all tables in a schema

答案 1 :(得分:0)

您的DBA是正确的,需要为每个创建的对象授予一个授权。可以自动执行此操作,这基本上可以为您提供所需的行为。我过去曾经做过。但是在实施之前,我会严重质疑该要求。

通常,新表不会在生产中自动创建,而是在构建过程中创建的。该构建过程的一部分涉及做诸如弄清楚谁应该有权访问表之类的事情。假设您正在通过某种源代码控制系统,这意味着您已经拥有对象授予的历史记录,并且可以将这些授予中的更改与用户案例联系起来。这是一件有用的事情。

如果您的应用程序正在生产中动态创建新表(例如我所支持的现成应用程序),或者执行了其他一些在构建过程中授予资助有问题的操作,则可以使用DDL触发器。

  • 创建在创建表时触发的DDL触发器
  • 在该DDL触发器中,在dbms_job语句提交后立即使用CREATE TABLE运行Grant语句

类似的事情应该起作用(未经测试)

CREATE OR REPLACE TRIGGER ddl_create
   AFTER CREATE ON SCHEMA
DECLARE
   l_job         BINARY_INTEGER;
   l_sql         VARCHAR2(4000);
BEGIN
   IF ora_dict_obj_type = 'TABLE' 
  THEN
      l_sql := 'grant select on ' ||
                 ora_dict_obj_owner || '.' || ora_dict_obj_name ||
                 ' to analytics';

      DBMS_JOB.SUBMIT (
          job => l_job,
         what => l_sql );
   END IF;
END;

由于作业是异步运行的,因此创建表后可能需要一两秒钟才能运行,如果应用程序立即尝试在对象上运行查询,则可能会出现问题。您的DBA也有可能禁用作业或限制可以同时运行的作业数量,这可能进一步延迟授予。而且,如果触发器或工作出了点问题,这是一种非常模糊的方法,需要花一些时间才能弄清问题出在哪里。当某人决定说他们想要一个新角色来自动获得对新表的insert访问权限或没有发生授权时,DBA并不习惯寻找可能授予特权的DDL触发器。因为工作被禁用。