如何在 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 中创建的用户?谢谢

iOS 核心数据存储在 iCloud 中以与其他设备同步

Python 如何从使用 oauthlib 的帐户身份验证获取 ID_Token 以与 Open ID Connect 一起使用

如何更改我的 github 帐户? [复制]