根据某个dba用户,创建一个新用户,并且新用户仅支持登录和查询,没有其它权限

2020-02-24 1703 星期一 根据某个dba用户,创建一个新用户,并且新用户仅支持登录和查询,没有其它权限

1.查看存储过程或者function不通过的原因

select sysdate,t.* from SYS.USER_ERRORS t; --查看存储过程或者function不通过的原因

2.创建用户

--–创建用户,ok,2020-02-24 1411
create user c##abcd_prod_query 
identified by abcfddww445555;
--------授予查询任何表,ok,2020-02-24 1412
grant select any table to c##abcd_prod_query ; 
----授予查询任何字典,ok,2020-02-24 1413
grant select any dictionary to c##abcd_prod_query ;
---授予zhangsan用户创建session的权限,即登陆权限,2020-02-24 1416 星期一,ok
grant create session to c##abcd_prod_query  ;
grant connect to c##abcd_prod_query  ;--2020-02-24 1425 星期一,ok

3.授权日志表

-- Create table
create table GRANT_USE_LOG
(
  ID          VARCHAR2(32),
  USER_NAME   VARCHAR2(50),
  DBA_USER    VARCHAR2(50),
  QUERY_USER  VARCHAR2(50),
  BATCH_ID    VARCHAR2(50),
  SQL         VARCHAR2(500),
  NUM         NUMBER,
  CREATE_DATE DATE
)
tablespace USERS
  pctfree 10
  initrans 1
  maxtrans 255;
-- Add comments to the table 
comment on table GRANT_USE_LOG
  is '根据dab用户-创建用户授权-仅查询-20200224';
-- Add comments to the columns 
comment on column GRANT_USE_LOG.ID
  is '主键唯一';
comment on column GRANT_USE_LOG.USER_NAME
  is '操作数据的用户';
comment on column GRANT_USE_LOG.DBA_USER
  is '具有dba权限的用户';
comment on column GRANT_USE_LOG.QUERY_USER
  is '仅查询的用户';
comment on column GRANT_USE_LOG.BATCH_ID
  is '批次号';
comment on column GRANT_USE_LOG.SQL
  is '执行sql';
comment on column GRANT_USE_LOG.NUM
  is '序号';
comment on column GRANT_USE_LOG.CREATE_DATE
  is '创建时间';


3 . 给新建的用户,授权仅查询,不能新增/修改/删除数据,不能创建表,不能删除表


create or replace procedure grant_user_only_query(
p_user_name     IN VARCHAR2,/*入参:当前操作的用户*/
p_user_dba      IN VARCHAR2,/*入参:dba用户*/
p_user_query    IN VARCHAR2,/*入参:仅查询功能用户*/
p_is_debug      IN VARCHAR2,/*入参:是否开始debug输出中间环节Y/N不区分大小写,传空不输出*/
p_result_code   OUT number ,/*出参:返回码:0-成功 1-失败*/
p_result_msg    OUT varchar2 /*出参:返回错误信息*/
)as
/*
select sysdate,t.* from SYS.USER_ERRORS t; 查看存储过程或者function不通过的原因
2020-02-24 1510 星期一  oracle用户库中创建仅有查询权限的用户-仅查询
2020-02-24 1830 星期一 问题
[Error Code:-20000].SQLERRM:ORA-20000: ORU-10027: buffer overflow, limit of 10000 bytes
解决方案:
在plsql中编辑存储过程时,存储过程中的begin…end中,begin后面直接加上DBMS_OUTPUT.ENABLE(buffer_size => null) ,表示输出buffer不受限制。
或者在调用存储过程时,begin后面加上DBMS_OUTPUT.ENABLE(buffer_size => null) ,本次执行任务输出buffer不受限制。
————————————————
版权声明:本文为CSDN博主「黄宝康」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/huangbaokang/article/details/92593502
*/
v_bacth_id      varchar2(32)       := '';/*批次号*/
v_sqm           varchar2(10)       := '''';/*单引号Single quotation mark*/
v_sysstr        varchar2(32767)    := '';/*系统串*/
v_sysdate_log   varchar2(100)      := '';/*系统时间:日志*/
v_dfm_log       varchar2(100)      := 'yyyy-mm-dd hh24:mi:ss.ff';/*系统时间v_dataformate*/
v_dfm_data      varchar2(100)      := 'yyyy-mm-dd hh24:mi:ss';/*系统时间v_dataformate*/
v_str           varchar2(32767)    := '';/*变量*/
v_sql           varchar2(32767)    := '';/*SQL语句变量*/
v_sql2          varchar2(32767)    := '';/*SQL语句变量*/
v_is_same       varchar2(10)       := 'N';/*是否找到用户:默认N没有找到*/
v_num           number             := 0;/*计数*/
v_split_line    varchar2(100)      := '***********分割线****************';
cursor query_user is select distinct t.OWNER from all_tab_comments t;/*查询所有用户的表,视图等。去掉,查所有的用户*/
/* 标准游标sql
cursor query_table is select t.table_name from all_tab_comments t  where t.owner = 'C##DBA' and t.table_name not like 'BIN$%'
*/
cursor query_table is select t.table_name from all_tab_comments t  where t.owner = p_user_dba and t.table_name not like 'BIN$%';
begin
  DBMS_OUTPUT.ENABLE(buffer_size => null);
      p_result_code  := 0;
      p_result_msg   := '';
     /********************************************************************/
     v_sql := 'select sys_guid() from dual';
     dbms_output.put_line('查询系统uuid,sql = ' || v_sql);
     execute immediate v_sql into v_bacth_id;
     /********************************************************************/
      v_sql := 'select to_char(systimestamp,' ||v_sqm|| v_dfm_log ||v_sqm|| ') from dual';
      dbms_output.put_line('查询系统时间sql = ' || v_sql);
      execute immediate v_sql into v_sysdate_log;
      v_sysstr  := '当前系统时间为:[' || v_sysdate_log                   || ']'
                               ||',DBA用户:[' || p_user_dba              || ']'
                               ||',仅查询用户:[' || p_user_query         || ']'
                               ||',操作人['||p_user_name                 || ']';
      dbms_output.put_line(v_split_line);
      /********************************************************************/
      /*******************游标for循环开始*****************************************/
       dbms_output.put_line('查找用户,begin,....................');
      for temp in query_user loop --temp为临时变量名,自己任意起
        v_num := v_num + 1;
          if (p_is_debug is not null and p_is_debug = 'Y') then
	           dbms_output.put_line(v_num || ',查询用户:' || temp.owner); --输出某个字段,使用"变量名.列名"即可。
          end if;
          if temp.owner = upper(p_user_dba) then
	           dbms_output.put_line(v_num  || ',找到一样的,库:[' || temp.owner || '],传入:[' || p_user_dba || ']'); --输出某个字段,使用"变量名.列名"即可。
             v_is_same := 'Y';
          end if;
       end loop;
       dbms_output.put_line('查找用户,end,....................');
     /*******************游标for循环结束*****************************************/
     dbms_output.put_line('v_is_same :' || v_is_same);
      dbms_output.put_line(v_split_line);
      v_num :=0;/*重置计数*/
     if v_is_same = 'Y' then
        dbms_output.put_line('权限用户,begin,....................');
          /*******************游标for循环开始*****************************************/
         for temp2 in query_table loop --temp为临时变量名,自己任意起
           v_num := v_num + 1;
            if (p_is_debug is not null and p_is_debug = 'Y') then
               dbms_output.put_line(temp2.table_name); --输出某个字段,使用"变量名.列名"即可。
            end if;
             /*grant select,insert,update,delete,all on 表名 to 用户名 生成很多条这个*/
             v_sql  := 'grant select on ' || temp2.table_name ||' to ' || p_user_query;
             v_sql2 := 'insert into grant_use_log (id,user_name,dba_user,query_user,batch_id,sql,num,create_date)values (
                    sys_guid(),'
                    ||v_sqm||  p_user_name        ||v_sqm||','
                    ||v_sqm||  p_user_dba         ||v_sqm||','
                    ||v_sqm||  p_user_query       ||v_sqm||','
                    ||v_sqm||  v_bacth_id         ||v_sqm||','
                    ||v_sqm||  v_sql              ||v_sqm||','
                    ||v_num||','
                    ||'sysdate)';
             execute immediate v_sql;/*执行权限*/
              dbms_output.put_line('第' || v_num || ',执行权限,' || v_sql);
             execute immediate v_sql2;/*插入log*/
             dbms_output.put_line('第' || v_num || ',插入log,' || v_sql2);
          end loop;
        dbms_output.put_line('权限用户,end,....................');
	   else
        p_result_code := 1;
        p_result_msg  := v_sysstr || ',没有找到用户';
        dbms_output.put_line(p_result_msg); --输出某个字段,使用"变量名.列名"即可。
     end if;
     /***********************************************************************************/
     commit;
EXCEPTION
      WHEN OTHERS THEN
      ROLLBACK;
      /*释放资源,如游标,临时表;回滚事务*/
      p_result_code := 1; /*传递给ETL_TOOL非0错误代码*/
      p_result_msg  := '[Error Code:' || to_char(SQLCODE) || '].SQLERRM:' || SQLERRM;
end grant_user_only_query;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值