我们有与数据库交互的不同hudson作业。因为他们都写入数据库并删除数据,所以我们无法同时运行2个工作,担心会有竞争条件。
因此我们决定为每个作业创建不同的用户(以防万一会产生不同的架构)。我创建了一个新用户,登录到oracle,我仍然可以看到其他用户插入的表和数据。我的理解是,在创建新用户时,您将得到一个清晰的名单。
我的哈德森工作是否仍会遇到与竞争条件相同的问题或为每项工作创建新用户会解决问题吗?
任何帮助将不胜感激。
答案 0 :(得分:2)
澄清条款。
数据库是一组用户,每个用户可以拥有对象(例如表格)。
用户可以引用其他用户拥有的对象。
例如,FRED可能拥有表BLUE。用户BARNEY可以编写SELECT * FROM FRED.BLUE语句。只有在BARNEY被授予FRED.BLUE的SELECT权限或具有SELECT ANY TABLE权限时,该语句才有效。
如果用户(例如WILMA)执行SELECT * FROM RED,则RED首先被解析为其默认架构中的对象,或者将其作为公共同义词而失败。用户的默认架构通常是它们自己的,但可以使用ALTER SESSION SET CURRENT_SCHEMA进行更改
因此,如果您的Hudson作业在同一个数据库中相互碰撞,它们可能使用完全限定的表示法来引用特定模式中的对象,或者它们可能正在使用引用对象的PUBLIC SYNONYM在特定模式中,或者它们正在对同一模式执行ALTER SESSION。
答案 1 :(得分:1)
以下是你必须要做的事情:
create user jobOneRunner identified by test;
- 此时他们应该没有任何权限,甚至没有创建会话。
要确保运行以下SQL:
select
lpad(' ', 2*level) || granted_role "User, his roles and privileges"
from
(
/* THE USERS */
select
null grantee,
username granted_role
from
dba_users
where
username like upper('%&enter_username%')
/* THE ROLES TO ROLES RELATIONS */
union
select
grantee,
granted_role
from
dba_role_privs
/* THE ROLES TO PRIVILEGE RELATIONS */
union
select
grantee,
privilege
from
dba_sys_privs
)
start with grantee is null
connect by grantee = prior granted_role;
如果JobOneRunner用户具有权限,请撤消它们。然后授予他们select / update / delete等访问权限,以便访问他们需要访问的任何对象。您还必须授予他们创建会话以便他们可以连接。
要将select / update / delete授予另一个模式所拥有的对象,请执行以下操作:
grant select on SCHEMA.object to jobOneRunner;
要回答你的第二个问题,是的,它会解决你的问题。但是,你确定可以确定竞争条件吗?