如何在 oracle 中以与现有帐户相同的权限复制模式?
Posted
技术标签:
【中文标题】如何在 oracle 中以与现有帐户相同的权限复制模式?【英文标题】:How to replicate schema with the same privileges of an existing account in oracle? 【发布时间】:2018-04-20 10:36:30 【问题描述】:在 Oracle for IT 客户票务操作/请求中,我们通常会收到这样的请求,以复制具有与其他用户相同的权限的用户帐户。或者您可以在这个或那个用户帐户之后说授予我的模型 ID。所以这里有一个简单的伪代码来实现这一点。
【问题讨论】:
【参考方案1】:在 Oracle SQL Developer 中,打开 DBA、安全和用户部分。
选择您的帐户。
右键单击。
选择,创建喜欢。
打开“复制对象权限”
提供新的用户名/密码。
瞧。
转到 SQL 页面,查看我们为您从数据字典中提取的代码。
它已经抓取了配额、角色、系统权限和对象权限。
在 18.1 版中,您也可以只打开用户并转到 SQL 页面并复制/粘贴/替换此处提供的代码中的架构名称。
唉! (我听到你说,我需要代码来执行此操作。)
您可以通过在 SQL Developer 中打开“日志”面板并单击“语句”页面来查看我们用于从数据库中获取此信息的 SQL。
代码如下:
select M.NAME,
decode(
NVL(
S.ADMIN_OPTION,
'NULL'
),
'NO',
'YES',
'NULL',
'NO',
'YES'
) GRANTED,
NVL(
ADMIN_OPTION,
'NO'
) ADMIN
from SYSTEM_PRIVILEGE_MAP M,
(
select *
from DBA_SYS_PRIVS
where (
GRANTEE =?
or ? = null
)
) S
where S.PRIVILEGE (+) = M.NAME
order by 1;
select R.ROLE,
decode(
S.NAME,
R.ROLE,
'YES',
'NO'
) GRANTED,
NVL(
S.ADMIN,
'NO'
) ADMIN,
NVL(
S.DEF,
'NO'
) DEF
from DBA_ROLES R,
(
select GRANTED_ROLE NAME,
ADMIN_OPTION ADMIN,
DEFAULT_ROLE DEF
from DBA_ROLE_PRIVS
where GRANTEE =?
) S
where S.NAME (+) = R.ROLE
and R.AUTHENTICATION_TYPE != 'GLOBAL'
order by 1;
select OWNER,
TABLE_NAME,
PRIVILEGE,
GRANTABLE
from DBA_TAB_PRIVS
where GRANTEE =?;
select ACCOUNT_STATUS,
DEFAULT_TABLESPACE DEF,
TEMPORARY_TABLESPACE TEMP,
PASSWORD,
EXTERNAL_NAME,
EDITIONS_ENABLED,
ALL_SHARD
from DBA_USERS
where USERNAME =?;
select T.TABLESPACE_NAME,
NVL(
Q.UNLIMITED,
'NO'
) UNLIMITED,
Q.QUOTA,
Q.UNIT,
T.CONTENTS
from DBA_TABLESPACES T,
(
select TABLESPACE_NAME,
decode(
MAX_BYTES,
-1,
'YES',
'NO'
) UNLIMITED,
decode(
MAX_BYTES,
-1,
null,
MAX_BYTES / 1024
) QUOTA,
'K' UNIT
from DBA_TS_QUOTAS
where (
USERNAME =:1
or :1 = null
)
) Q
where Q.TABLESPACE_NAME (+) = T.TABLESPACE_NAME
order by 1;
【讨论】:
非常感谢您!让添加新架构/用户变得超级容易。【参考方案2】:检查并获取现有用户帐户详细信息以创建一个新的进行复制。
select username,default_tablespace,profile from dba_users where username in ('Q861','BX57');
create user BX57 identified by caSrt57#nuj profile USERS;
使用生成的伪代码根据现有帐户向新用户授予权限。如果列表太长,您可以将输出假脱机并单独执行。
select 'grant '||granted_role||' to BX57;' from DBA_ROLE_PRIVS where grantee = upper('Q861');
select 'grant '||privilege||' to BX57;' from DBA_SYS_PRIVS where grantee in ('Q861');
select 'grant '||privilege||' on '||owner||'.'||table_name||' to BX57;' from DBA_TAB_PRIVS where grantee in ('Q861');
select 'grant '||privilege||' ('||column_name||') '||' on '||owner||'.'||table_name||' to BX57;' from DBA_COL_PRIVS where grantee in ('Q861');
谢谢!
【讨论】:
以上是关于如何在 oracle 中以与现有帐户相同的权限复制模式?的主要内容,如果未能解决你的问题,请参考以下文章
如何在CentBS中以与CentOS相同的方式实现FreeBSD中的expr功能?
如何将基于自定义图像的数据集加载到 Pytorch 中以与 CNN 一起使用?
如何将现有用户的权限授予我在 Oracle 中创建的用户?谢谢
Python 如何从使用 oauthlib 的帐户身份验证获取 ID_Token 以与 Open ID Connect 一起使用