繁体   English   中英

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

[英]How to GRANT SELECT to ANY Table in a Schema to a Role (Oracle)

我们希望在我们的 Oracle 数据库上创建一个 ANALYTICS 角色。 担任此 ANALYTICS 角色的任何人都应该能够跨一个(或多个)模式中的任何视图进行 SELECT,但不是所有模式。

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

我们的 DBA 说这是不可能的,我们创建的任何未来对象都需要应用授权,以授予对 ROLE 的访问权限。

“我们的 DBA 说这是不可能的,我们未来创建的任何对象都需要应用授权,才能访问 ROLE。”

您的 DBA 是正确的。 您正在搜索架构范围的权限(尚未实现)。

更多:对模式中的所有表进行 GRANT SELECT

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

通常,新表不会在生产中自动创建,它们是作为构建过程的一部分创建的。 构建过程的一部分涉及做一些事情,比如确定谁应该有权访问这些表。 假设您正在通过某种源代码控制系统,这意味着您拥有对象授权的历史记录,并且您可以将这些授权中的更改与用户故事联系起来。 这是一个有用的东西。

如果您的应用程序在生产中动态创建新表(例如我支持的现成应用程序),或者在执行其他操作时在构建过程中提供授权会出现问题,您可以使用 DDL 触发器自动执行该过程。

  • 创建一个在创建表时触发的 DDL 触发器
  • 在该 DDL 触发器中,使用dbms_jobCREATE TABLE语句提交后立即运行授权语句

这样的事情应该工作(未经测试)

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 也可能禁用作业或限制可以同时运行的作业数量,这可能会进一步延迟授予。 如果触发器或工作出现问题,这是一种非常模糊的方法,人们需要一段时间才能找出问题所在。 DBA 没有寻找 DDL 触发器的习惯,这些触发器可能会在有人决定时授予特权,例如,他们希望新角色自动获得对新表的insert访问权限,或者当由于作业被禁用而未发生授予时.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM