`

【GRANTS】【SCRIPTS】两种自动化获得Oracle授权语句的脚本

阅读更多

对于DBA来说,一切可以简化操作的尝试都要被鼓励。这里提供两种快速得到Oracle授权语句的脚本


第一种方法:可以通过SQL从一些数据字典中查询到授权信息,生成授权语句
undefine user_name
set pagesize 1000
select 'grant '||tt.granted_role||' to '||tt.grantee||';' as SQL_text
from dba_role_privs tt where tt.grantee=(upper('&&user_name'))
union all
select 'grant '||tt.privilege||' to '||tt.grantee||';'
from dba_sys_privs tt where tt.grantee=(upper('&&user_name'))
union all
select 'grant '||tt.privilege||' on '||owner||'.'||table_name||' to '||tt.grantee||';'
from dba_tab_privs tt where tt.grantee=(upper('&&user_name'))
union all
select 'alter user '||tt.user_name||' quota '||maxblocks*blocksize||' on '||ts_name||';'
from KU$_TSQUOTA_VIEW tt where tt.user_name=(upper('&&user_name'));

使用效果如下:

sys@ora10g> undefine user_name
sys@ora10g> set pagesize 1000
sys@ora10g> select 'grant '||tt.granted_role||' to '||tt.grantee||';' as SQL_text
  2  from dba_role_privs tt where tt.grantee=(upper('&&user_name'))
  3  union all
  4  select 'grant '||tt.privilege||' to '||tt.grantee||';'
  5  from dba_sys_privs tt where tt.grantee=(upper('&&user_name'))
  6  union all
  7  select 'grant '||tt.privilege||' on '||owner||'.'||table_name||' to '||tt.grantee||';'
  8  from dba_tab_privs tt where tt.grantee=(upper('&&user_name'))
  9  union all
 10  select 'alter user '||tt.user_name||' quota '||maxblocks*blocksize||' on '||ts_name||';'
 11  from KU$_TSQUOTA_VIEW tt where tt.user_name=(upper('&&user_name'));
Enter value for user_name: sec
old   2: from dba_role_privs tt where tt.grantee=(upper('&&user_name'))
new   2: from dba_role_privs tt where tt.grantee=(upper('sec'))
old   5: from dba_sys_privs tt where tt.grantee=(upper('&&user_name'))
new   5: from dba_sys_privs tt where tt.grantee=(upper('sec'))
old   8: from dba_tab_privs tt where tt.grantee=(upper('&&user_name'))
new   8: from dba_tab_privs tt where tt.grantee=(upper('sec'))
old  11: from KU$_TSQUOTA_VIEW tt where tt.user_name=(upper('&&user_name'))
new  11: from KU$_TSQUOTA_VIEW tt where tt.user_name=(upper('sec'))

SQL_TEXT
---------------------------------------
grant DBA to SEC;
grant UNLIMITED TABLESPACE to SEC;
grant WRITE on SYS.DIR1 to SEC;
grant READ on SYS.DIR1 to SEC;
grant READ on SYS.dir2 to SEC;
grant WRITE on SYS.dir2 to SEC;

6 rows selected.

第二种方法:通过Oracle提供的dbms_metadata包,获得更加详细准确的创建用户以及授权的DDL语句:
set serveroutput on size 1000000
set verify off
undefine user_name
declare
 v_name varchar2(30) := upper('&user_name');
 no_grant exception;
 pragma exception_init( no_grant, -31608 );
begin
 dbms_metadata.set_transform_param(dbms_metadata.SESSION_TRANSFORM, 'SQLTERMINATOR', TRUE);
 dbms_output.enable(1000000);
 dbms_output.put_line(dbms_metadata.get_ddl('USER',v_name));
 begin
   dbms_output.put_line(dbms_metadata.get_granted_ddl('SYSTEM_GRANT',v_name));
 exception
   when no_grant then dbms_output.put_line('-- No system privs granted');
 end;
 begin
   dbms_output.put_line(dbms_metadata.get_granted_ddl('ROLE_GRANT',v_name));
 exception
   when no_grant then dbms_output.put_line('-- No role privs granted');
 end;
 begin
   dbms_output.put_line(dbms_metadata.get_granted_ddl('OBJECT_GRANT',v_name));
 exception
   when no_grant then dbms_output.put_line('-- No object privs granted');
 end;
 begin
  dbms_output.put_line(dbms_metadata.get_granted_ddl('TABLESPACE_QUOTA',v_name));
 exception
   when no_grant then dbms_output.put_line('-- No tablespace quota specified');
 end;
 dbms_output.put_line(dbms_metadata.get_granted_ddl('DEFAULT_ROLE', v_name ));
exception
 when others then
  if SQLCODE = -31603 then dbms_output.put_line('-- User does not exists');
  else raise;
  end if;
end;
/

使用过程如下:

sys@ora10g> set serveroutput on size 1000000
sys@ora10g> set verify off
sys@ora10g> undefine user_name
sys@ora10g> declare
  2   v_name varchar2(30) := upper('&user_name');
  3   no_grant exception;
  4   pragma exception_init( no_grant, -31608 );
  5  begin
  6   dbms_metadata.set_transform_param(dbms_metadata.SESSION_TRANSFORM, 'SQLTERMINATOR', TRUE);
  7   dbms_output.enable(1000000);
  8   dbms_output.put_line(dbms_metadata.get_ddl('USER',v_name));
  9   begin
 10     dbms_output.put_line(dbms_metadata.get_granted_ddl('SYSTEM_GRANT',v_name));
 11   exception
 12     when no_grant then dbms_output.put_line('-- No system privs granted');
 13   end;
 14   begin
 15     dbms_output.put_line(dbms_metadata.get_granted_ddl('ROLE_GRANT',v_name));
 16   exception
 17     when no_grant then dbms_output.put_line('-- No role privs granted');
 18   end;
 19   begin
 20     dbms_output.put_line(dbms_metadata.get_granted_ddl('OBJECT_GRANT',v_name));
 21   exception
 22     when no_grant then dbms_output.put_line('-- No object privs granted');
 23   end;
 24   begin
 25    dbms_output.put_line(dbms_metadata.get_granted_ddl('TABLESPACE_QUOTA',v_name));
 26   exception
 27     when no_grant then dbms_output.put_line('-- No tablespace quota specified');
 28   end;
 29   dbms_output.put_line(dbms_metadata.get_granted_ddl('DEFAULT_ROLE', v_name ));
 30  exception
 31   when others then
 32    if SQLCODE = -31603 then dbms_output.put_line('-- User does not exists');
 33    else raise;
 34    end if;
 35  end;
 36  /
Enter value for user_name: sec

   CREATE USER "SEC" IDENTIFIED BY VALUES '9EC74A4FC0A9E227'
      DEFAULT TABLESPACE "TBS_SEC_D"
      TEMPORARY TABLESPACE
"TEMP";


  GRANT UNLIMITED TABLESPACE TO "SEC";


   GRANT "DBA" TO "SEC";


  GRANT READ ON DIRECTORY "DIR1" TO "SEC" WITH GRANT OPTION;

  GRANT WRITE ON DIRECTORY "DIR1" TO "SEC" WITH GRANT OPTION;


  GRANT WRITE ON DIRECTORY "dir2" TO "SEC" WITH GRANT OPTION;

  GRANT READ ON DIRECTORY "dir2" TO "SEC" WITH GRANT OPTION;

-- No tablespace quota specified

   ALTER USER "SEC" DEFAULT ROLE ALL;


PL/SQL procedure successfully completed.

鼓励任何形式的自动化尝试,这才是DBA的真正价值的体现。

-- The End --

分享到:
评论

相关推荐

    Oracle Grants Proposal Implementation Guide Release 11i

    Oracle Grants Proposal Implementation Guide Release 11i Part No. A85

    Oracle Grants Accounting User’s Guide Release 11i

    Oracle Grants Accounting User’s Guide Release 11i Part No. A85357-0

    Oracle Security

    SQL Scripts to Generate Scripts Chapter 12 Backing Up and Recovering the Database What Are the Backup Options? What’s New for Oracle8? What Are the Recovery Options? Chapter 13 Using the Oracle...

    最全的oracle常用命令大全.txt

    ORACLE常用命令 一、ORACLE的启动和关闭 1、在单机环境下 要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下 su - oracle a、启动ORACLE系统 oracle>svrmgrl SVRMGR>connect internal SVRMGR>startup ...

    Oracle10g DBA经常使用的动态性能视图和数据字典

    v$sqlarea:共享池中使用当前光标的统计信息,光标是一块内存区域,有Oracle处理SQL语句时打开。 v$statname:在v$sesstat中报告各个统计的含义 v$sysstat:基于当前操作会话进行的系统统计 v$waitstat:出现一个...

    oracle详解

    导入/导出是ORACLE幸存的最古老的两个命令行工具,其实我从来不认为Exp/Imp是一种好的备份方式,正确的说法是Exp/Imp只能是一个好的转储工具,特别是在小型数据库的转储,表空间的迁移,表的抽取,检测逻辑和物理...

    grants_guo.pdf

    grants_guo.pdf

    grants_unc.pdf

    grants_unc.pdf

    grants_jones.pdf

    grants_jones.pdf

    oracle安装及备份

    nc_uap 客户化(客户化,基础数据,web开发框架,外部交换平台,二次开发工具,查询引擎,web服务,业务依赖数据) nc_am 资产管理与固定资产 nc_fi 总账,固定资产,会计平台,财务公共,现金管理,应收、应付,...

    SQL21日自学通

    Insufficient Privileges During Grants484 Escape Character in Your Statement--Invalid Character 485 Cannot Create Operating System File 485 Common Logical Mistakes485 Using Reserved Words in Your SQL ...

    Sql语句语法大全

    2. 权限-- 显示权限信息SHOW GRANTS FOR your_username@'localhost'; -- 授予权限GRANT some_privileges ON some_databases(some_tables) TO some_users@'localhost'; -- 撤销权限REVOKE some_privileges ON some_...

    mysqlaudit:Shell脚本,用户可以使用该脚本从Mysql数据库中查询数据以进行审核或安全性目的

    想法是从Mysql获取基本信息,并使用该信息自动转发。 如何 将脚本和“ sql /”文件夹复制到已安装mysql服务器的服务器。 赋予mysql-audit.sh脚本执行权限:chmod + x mysql-audit.sh。 您无需在操作系统中以root...

    oracle数据备份

    oracle数据备份 例如 单表备份(前提库的结构是一样的) 导出: 开始钮->运行->输入CMD->进入DOS界面 EXP 用户名/密码@连接字符串 GRANTS=Y TABLES=(stu) file=C:\文件名.DMP 导入: 开始钮->运行->输入CMD->进入...

    oracole备份数据库

     EXP fxz/fxz@67 file=f:“oracle”backup“%date:~0,10%.dmp log=f:”oracle“backup”%date:~0,10%.log compress=n buffer=8092 consistent=y direct=n constraints=y feedback=10000 grants=y record=y ...

    mysql grants小记

    grant命令是对mysql数据库进行用户创建,权限或其他参数控制的强大的命令,官网上介绍它就有几大页,要用精它恐怕不是一日半早的事情,权宜根据心得慢慢领会吧!

    mysql-parse-grants

    解析MySQL授权这个Typescript模块解析MySQL的SHOW GRANTS [FOR USER username@host]发出的授予。

    MYSQL培训经典教程(共两部分) 2/2

    DESCRIBE语句显示数据表的信息 59 3.4.2 使用mysqlshow 工具得到信息 60 3.4.3 用CREATE TABLE 语句创建数据表 60 3.4.4利用 SELECT 的结果创建表 62 3.4.5 用ALTER TABLE语句修改表的结构 63 3.4.6 ...

    MYSQL培训经典教程(共两部分) 1/2

    DESCRIBE语句显示数据表的信息 59 3.4.2 使用mysqlshow 工具得到信息 60 3.4.3 用CREATE TABLE 语句创建数据表 60 3.4.4利用 SELECT 的结果创建表 62 3.4.5 用ALTER TABLE语句修改表的结构 63 3.4.6 ...

    hpm-grants-mod

    hpm-grants-mod

Global site tag (gtag.js) - Google Analytics