我们在Oracle DB 11gR2中有几个专用于模块(财务,库存,crm等)的模式。我们希望为开发人员建立一个架构:
- 开发人员不会拥有架构所有者用户的密码。
- 根据开发人员对数据库对象的访问时间有限 以两种方式达到他们的水平:
- 顶级高级开发人员 当它们具有特定的特定模式时,它将拥有无限的特权 授权在有限的时间内。
- 初级开发人员将拥有 授权时,特定模式的有限特权 有限的时间。
简而言之,我们希望在Oracle DB中组织我们的开发方式。我们如何建立这种结构? 如果我不够清楚,我可以提供您的问题的详细信息。
谢谢,
编辑:我有直觉认为案件不太清楚。让我举一个简单的场景:
假设我有一个名为'DUMMY'的模式(带有对象的用户),它有一个名为'DummyTbl'的表和一个名为'DummyFunc'的函数。显然,用户'DUMMY'可以无限制地管理所有这些对象,因为她是所有者。但是,我不希望开发人员使用通用用户'DUMMY',我希望他们使用自己的用户名登录数据库。
因为当我向用户提供用户'DUMMY的密码时,我无法区分开发者的特权级别。所有开发人员都可以无限制地行事。相反,我希望名为“DummySenior”的高级开发人员能够创建,更改,执行对象,并且还可以对“DummyTbl”执行CRUD操作。
但是,我希望名为'DummyJunior'的初级开发人员仅引用对象而不对表执行CRUD操作。实现这一目标最明显的方法是陪伴角色。但是,我们在配置所需角色时遇到了几个问题(即,'DummySenior'能够在'DUMMY'模式下创建表格,他必须'创建任何表'权限。
然而,当'DummySenior'具有该特权时,他也可以在'DUMMY2'模式下创建表格。这是一个明显的安全漏洞。)
答案 0 :(得分:1)
对于高级开发人员,您可以创建一个定义者权限过程,只需运行任何传入的命令。假设DUMMY具有相关的CREATE TABLE/VIEW/...
权限,这有效地为高级开发人员提供了所有SELECT ANY
特权,但仅适用于那个架构。
create or replace procedure dummy.execute_any(p_code in clob) authid definer is
begin
execute immediate p_code;
end;
/
--For a procedure this powerful, grant it directly to a user.
--That keeps the privilege "obvious", it won't get buried in layers of roles.
grant execute on dummy to senior_developer;
对于初级开发人员,请创建一个角色并动态授予其相关的SELECT
权限。您可能希望安排此过程或临时运行它。
--Create and populate role with some lesser object privileges on a schema.
create role junior_developer_role;
begin
--Repeat this structure for other objects, like sequences.
for tables in
(
select owner, table_name
from dba_tables
where owner = 'DUMMY'
) loop
execute immediate 'grant select on '||tables.owner||'.'||tables.table_name||
' to junior_developer_role';
end loop;
end;
/