`

【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导入导出语句.txt

    Oracle提供了两种主要的数据导入导出工具:`EXPDP` 和 `IMPDP`,它们分别是 `EXP` 和 `IMP` 的增强版,支持更多特性如并行处理、压缩等,但本文将主要聚焦于传统的 `EXP` 和 `IMP` 命令。 ### 导出(Export) ####...

    Oracle导出脚本文件的方法

    Oracle提供了两种主要的导出工具:`expdp`和`exp`。其中,`exp`是较早版本的导出工具,在Oracle 10g及以前的版本中广泛使用;而`expdp`则是在Oracle 10g引入的新一代导出工具,具有更高的性能和更多的特性。本文将...

    在suse下添加oracle 11g自动备份

    为了实现Oracle 11g数据库在SUSE下的自动化备份,我们可以利用SUSE自带的任务计划程序Cron来定期执行备份脚本。下面将详细介绍整个过程: 1. **环境准备**:确保Oracle 11g已经在SUSE上正确安装并配置完毕。 2. **...

    Oracle Grants Accounting User’s Guide Release 11i

    Oracle Grants Accounting User’s Guide Release 11i 是一本专为使用Oracle数据库系统进行政府和非营利组织财务管理和会计操作的用户编写的指南。这本指南旨在帮助用户理解和掌握Oracle Grants Accounting模块的...

    oracle笔记 (导出、导入、创建用户、授权、insert,rownum)

    本文将深入探讨Oracle笔记中的几个关键概念:导出、导入、创建用户、授权以及使用INSERT语句和ROWNUM。 1. 导出(Export)与导入(Import): Oracle提供了数据泵(Data Pump)工具用于数据的导出和导入,它极大地...

    Oracle常用语句

    ### Oracle常用语句知识点 #### 一、用户管理 **创建用户:** ```sql CREATE USER ơkcyg2 IDENTIFIED BY 롰kcyg; ``` 此语句用于创建一个新用户`ơkcyg2`,并设置其密码为`롤kcyg`。在实际操作中,用户名和密码...

    ORACLE自动备份方法

    综上所述,通过编写备份脚本、配置定时任务以及实施有效的监控机制,可以轻松实现Oracle数据库的自动化备份。这不仅能够提高数据库管理效率,还能有效降低数据丢失的风险,是数据库管理员不可或缺的一项技能。

    mysql与oracle差异总结

    MySql 中有三种注释方式,而 Oracle 只有两种。 10. 字符函数 MySql 中的 DATE_FORMAT 函数相当于 Oracle 中的 TO_CHAR 函数。MySql 中的 STR_TO_DATE 函数相当于 Oracle 中的 TO_DATE 函数。 11. 回车符、换行符...

    Oracle Grants Proposal Implementation Guide Release 11i

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

    oracle的exp备份

    在本例中,"oracle的exp备份脚本.bat"很可能是用于自动化这个过程的批处理文件,它可能包含了执行EXP命令的必要参数。 3. **EXP命令格式**: 命令的基本结构如下: ``` exp [username/password@database] file=...

    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自动备份方法

    本文将详细介绍如何设置Oracle数据库的自动备份方法,以确保数据能够在意外发生时得到及时恢复。 #### 二、自动备份方案概述 为了实现Oracle数据库的自动备份,我们可以利用系统自带的任务计划功能配合自定义脚本...

    oracle 数据文件导入语句1

    ### Oracle 数据文件导入语句详解 #### 一、概述 Oracle 数据库的导入导出功能是数据库管理中非常重要的组成部分,它提供了灵活高效的方式来进行数据迁移、备份与恢复等工作。在给定的文件中,主要关注的是通过 `...

    oracle初学者指南

    3. 性能监视工具:如Oracle Enterprise Manager Cloud Control,提供图形化的数据库监控和管理界面。 总结,Oracle初学者应从基础理论入手,逐步熟悉Oracle的各项操作,同时不断实践,加深理解。随着经验的积累,你...

    oracle学习笔记下载

    在 Windows 系统中,通过编写批处理脚本来自动化数据库操作是一种高效的方法。 ##### 执行 SQL 脚本 - **`C:\A.BAT: SQLPLUS "SYS/MANAGER AS SYSDBA" @B.BAT`**:调用 SQL*Plus 执行 B.BAT 文件中的命令。 - **`C:...

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

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

    oracle批处理文件.docx

    Oracle批处理文件是用于自动化数据库备份和恢复过程的脚本,尤其在大型企业环境中,确保数据的安全和可恢复性至关重要。以下是对Oracle批处理文件及其相关知识点的详细说明: 1. **Oracle EXP导出功能**: Oracle ...

    Oracle基本知识总结.docx

    Oracle 中有两种模式:归档模式和非归档模式。查看归档模式可以使用 Archive log list 命令。要修改归档模式,首先需要关闭数据库,使用 Shutdown immediate 命令,然后在 Mount 数据库,使用 Startup mount 命令...

    oracle_自动备份Windows环境.pdf

    本方案介绍了一种在Windows环境下使用批处理脚本配合Oracle的EXP导出工具以及Windows的任务计划程序实现Oracle数据库自动备份的方法。这种方法简单有效,能够根据日期自动创建并管理备份文件,支持不同时间粒度(如...

Global site tag (gtag.js) - Google Analytics