[英]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 是正确的。 您正在搜索架构范围的权限(尚未实现)。
您的 DBA 是正确的,每个创建的对象都需要授权。 可以自动执行此操作,这基本上可以为您提供所需的行为。 我过去做过这件事。 但在实施之前,我会认真质疑该要求。
通常,新表不会在生产中自动创建,它们是作为构建过程的一部分创建的。 构建过程的一部分涉及做一些事情,比如确定谁应该有权访问这些表。 假设您正在通过某种源代码控制系统,这意味着您拥有对象授权的历史记录,并且您可以将这些授权中的更改与用户故事联系起来。 这是一个有用的东西。
如果您的应用程序在生产中动态创建新表(例如我支持的现成应用程序),或者在执行其他操作时在构建过程中提供授权会出现问题,您可以使用 DDL 触发器自动执行该过程。
dbms_job
在CREATE 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.