目的:由于公司数据库权限管理的很严,每次新建表后需要手动授权给相应的用户,并且还要创建同义词。这就很是麻烦。账号一多就特别花时间。所以自己写了两个存储过程和定时JOB来实现动态授权。

需求:A用户访问B用户,A用户可以增删改查B用户所有表(不包括系统表)。A是普通用户,B用户拥有DBA权限,所以我们不能用以下方式授权,这样会把系统表的权限也放出去。

grant select any table to a;grant all on b.table_name to a;

一、授予A用户访问B用户现有表访问权限

1.新建一个普通用户A。

create user 用户名 identified by "密码" default tablespace 表空间 temporary tablespace temp;

授予A用户resource/connect权限、创建私有同义词权限。

grant create synonym to A;grant resource,connect to A;

2.授予A用户访问B用户所有表权限,另存为.sql后缀,放在Command里面执行。

select 'GRANT select, insert, update, delete ON B.'|| 表名||' to A;'  from user_tables;

创建所有表的私有同义词,在A用户上创建

select 'create synonym '||同义词名称||' for B.'||表名||';'  from user_tables where tablespace_name='表空间';

以上操作是针对B用户下现有表授予A用户访问权限。

二、通过JOB定时调用存储过程实现动态授权A用户。

准备:A用户下两张表、两个sequence、两个触发器(可有可无)、一个存储过程、一个定时JOB。B用户一个存储过程、一个定时JOB

两张表可根据自身需求增加相应的字段。

1.A用户

A用户表1

create table CREATE_LOG
(pid     INTEGER not null,pobject VARCHAR2(400),sjc     VARCHAR2(14)
);
alter table CREATE_LOG add primary key (PID);

A用户表2

create table CREATE_OBJECT
(pid     INTEGER not null,sobject VARCHAR2(400),sjc     VARCHAR2(14)
);
alter table NEWINGS_OBJECTadd primary key (PID);
grant select, insert on CREATE_OBJECT to B; #授权给B用户访问,存储过程里面要用到

sequence是给两张表主键使用的,创建一下就好了。触发器主要是实现主键自增和将空的时间戳赋值。很简单

存储过程

create or replace procedure create_actions is--scount number(10);snum number(10);
begindeclarecursor cur is select sobject from newings_object where sjc>=to_char(sysdate,'yyyymmdd');beginfor cur_result in cur  loopselect count(1) into snum from create_log where pobject=cur_result.sobject;if snum=0 thenEXECUTE IMMEDIATE 'create synonym '||cur_result.sobject||' for B.'||cur_result.sobject;insert into create_log(pobject) values(cur_result.sobject);commit;end if;end loop;end;end;

定时JOB(A、B用户定时JOB执行时间最好是错开)

declarejob number;
BEGINDBMS_JOB.SUBMIT(  JOB => job,  /*自动生成JOB_ID*/  WHAT => 'create_actions;',  /*需要执行的存储过程名称或SQL语句*/  NEXT_DATE => sysdate+3/(24*60),  /*初次执行时间-下一个3分钟*/  INTERVAL => 'trunc(sysdate,''mi'')+1/(24*60)' /*每隔1分钟执行一次*/);  commit;
end;

2.B用户

存储过程

create or replace procedure create_action
isscount number(10);snum number(10);
beginselect count(1) into scount from user_objects where to_char(created,'yyyymmddhh24miss')>=to_char(sysdate,'yyyymmdd') and object_type='TABLE';declarecursor cur isselect object_name from user_objects where to_char(created,'yyyymmddhh24miss')>=to_char(sysdate,'yyyymmdd') and object_type='TABLE'; beginfor cur_result in cur  loop  if scount>0 then select count(1) into snum from A.newings_object where sobject=cur_result.object_name;if snum=0 thenEXECUTE IMMEDIATE 'grant select,insert,update,delete on B.'||cur_result.object_name||' to A';--EXECUTE IMMEDIATE 'insert into A.newings_object(sobject) values('||cur_result.object_name||')';insert into roobbin.newings_object(sobject) values(cur_result.object_name);commit;end if;end if;end loop;end;
end;

定时JOB,A、B用户定时JOB执行时间最好是错开

declarejob number;
BEGINDBMS_JOB.SUBMIT(  JOB => job,  /*自动生成JOB_ID*/  WHAT => 'create_action;',  /*需要执行的存储过程名称或SQL语句*/  NEXT_DATE => sysdate+3/(24*60),  /*初次执行时间-下一个3分钟*/  INTERVAL => 'trunc(sysdate,''mi'')+1/(24*60)' /*每隔1分钟执行一次*/);  commit;
end;

附:user_jobs主要字段说明

列名             数据类型           解释
JOB             NUMBER             任务的唯一标示号
LOG_USER        VARCHAR2(30)      提交任务的用户
PRIV_USER       VARCHAR2(30)       赋予任务权限的用户
SCHEMA_USER     VARCHAR2(30)       对任务作语法分析的用户模式
LAST_DATE       DATE               最后一次成功运行任务的时间
LAST_SEC        VARCHAR2(8)        如HH24:MM:SS格式的last_date日期的小时,分钟和秒
THIS_DATE       DATE               正在运行任务的开始时间,如果没有运行任务则为null
THIS_SEC        VARCHAR2(8)        如HH24:MM:SS格式的this_date日期的小时,分钟和秒
NEXT_DATE       DATE               下一次定时运行任务的时间
NEXT_SEC        VARCHAR2(8)        如HH24:MM:SS格式的next_date日期的小时,分钟和秒
TOTAL_TIME      NUMBER             该任务运行所需要的总时间,单位为秒
BROKEN          VARCHAR2(1)        标志参数,Y标示任务中断,以后不会运行
INTERVAL        VARCHAR2(200)      用于计算下一运行时间的表达式
FAILURES        NUMBER             任务运行连续没有成功的次数
WHAT            VARCHAR2(2000)     执行任务的PL/SQL块

INTERVAL常用参数示例
    每天午夜12点            ''TRUNC(SYSDATE + 1)''     每天早上8点30分         ''TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)''     每星期二中午12点         ''NEXT_DAY(TRUNC(SYSDATE ), ''''TUESDAY'''' ) + 12/24''     每个月第一天的午夜12点    ''TRUNC(LAST_DAY(SYSDATE ) + 1)''     每个季度最后一天的晚上11点 ''TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), ''Q'' ) -1/24''     每星期六和日早上6点10分    ''TRUNC(LEAST(NEXT_DAY(SYSDATE, ''''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)''    每3秒钟执行一次             'sysdate+3/(24*60*60)'   每2分钟执行一次           'sysdate+2/(24*60)'   1:每分钟执行  Interval => TRUNC(sysdate,'mi') + 1/ (24*60) --每分钟执行  interval => 'sysdate+1/(24*60)'  --每分钟执行  interval => 'sysdate+1'    --每天  interval => 'sysdate+1/24'   --每小时  interval => 'sysdate+2/24*60' --每2分钟  interval => 'sysdate+30/24*60*60'  --每30秒  2:每天定时执行  Interval => TRUNC(sysdate+1)  --每天凌晨0点执行  Interval => TRUNC(sysdate+1)+1/24  --每天凌晨1点执行  Interval => TRUNC(SYSDATE+1)+(8*60+30)/(24*60)  --每天早上8点30分执行  3:每周定时执行  Interval => TRUNC(next_day(sysdate,'星期一'))+1/24  --每周一凌晨1点执行  Interval => TRUNC(next_day(sysdate,1))+2/24  --每周一凌晨2点执行  4:每月定时执行  Interval =>TTRUNC(LAST_DAY(SYSDATE)+1)  --每月1日凌晨0点执行  Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24  --每月1日凌晨1点执行  5:每季度定时执行  Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'q')  --每季度的第一天凌晨0点执行  Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'q') + 1/24  --每季度的第一天凌晨1点执行  Interval => TRUNC(ADD_MONTHS(SYSDATE+ 2/24,3),'q')-1/24  --每季度的最后一天的晚上11点执行  6:每半年定时执行  Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24  --每年7月1日和1月1日凌晨1点  7:每年定时执行  Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24  --每年1月1日凌晨1点执行  

参考博客:https://www.cnblogs.com/Chestnuts/p/7068456.html
大概就是这一个样子,已亲测可以使用。如有需要改进的地方请留言,谢谢!

转载于:https://www.cnblogs.com/Roobbin/p/10621743.html

Oracle动态授权用户权限相关推荐

  1. oracle中查看用户权限

    oracle中查看用户权限 博客分类: Oracle权限 OracleSQL 1.查看所有用户:   select * from dba_users;   select * from all_user ...

  2. oracle怎么赋予系统权限,讲解Oracle系统中用户权限的赋予和查看

    在Oracle数据库系统中,用户权限分为两种(本文不涉及dba或oper的权限,只讲解普通用户的权限),分别是System Privilege系统权限和User Table Privilege用户数据 ...

  3. 【逗老师带你学IT】Zoom动态授权用户Pro License妈妈再也不用担心预算超标了

    Zoom是个好东西,但是License也不便宜.免费的用户主持的会议,又会存在45分钟限制. 本文介绍,如何通过后台脚本,定时对用户进行授权和回收授权操作.列出Zoom内所有用户的所有会议,到点了自动 ...

  4. oracle里的超级用户,Oracle中超级用户权限的管理

    Oracle 的用户根据所被授予的权限分为系统权限和对象权限.其中最高的权限是sysdba. Sysdba具有控制Oracle一切行为的特权,诸如创建.启动.关闭.恢复数据库,使数据库归档/非归档,备 ...

  5. MySql 授权用户权限如何设置?

    首先:去 mysql 库中查看 root 用户的权限 select * from user where user = 'root' and host='localhost'; 查看root权限为所有i ...

  6. linux 怎么改授权用户权限,linux – systemd:授予非特权用户权限以更改某个特定服务...

    我可以想到两种方法: 一种方法是使服务成为用户服务而不是系统服务. systemd单元不是创建系统单元,而是放在服务用户的主目录下,位于$HOME / .config / systemd / user ...

  7. oracle之控制用户权限和练习

  8. oracle rman 用户,对Oracle数据库进行RMAN备份的Oracle数据库用户权限

    在Oracle 12版本或者更高版本,Oracle备份用户需要具有SYSDBA或者SYSBACKUP权限 在Oracle 11(包括11版本)以前,Oracle备份用户需要具有SYSDBA权限 创建及 ...

  9. oracle 如何查看权限,如何查看Oracle的用户权限

    ORACLE数据字典视图的种类分别为:USER,ALL 和 DBA. USER_*:有关用户所拥有的对象信息,即用户自己创建的对象信息 ALL_*:有关用户可以访问的对象的信息,即用户自己创建的对象的 ...

最新文章

  1. 打靶归来——记参加射击比赛感想
  2. 初学Python——面向对象编程
  3. .net EF监控 MiniProfiler
  4. 四种ASP网页跳转代码
  5. 创维e900s用的什么芯片_MT41K512M16HA-125_苹果XR用的是什么闪存芯片
  6. 【ROS-Error】 Can‘t convert image: local variable ‘pil_mode‘ referenced before assignment
  7. dism++封装系统使用教程_客栈管理系统“订单来了”客房订单盒子使用教程
  8. 利用宏定义在编译阶段检查结构体大小的方法
  9. CSS:布局——伸缩布局flex
  10. java创建线程的三种方式及其对照
  11. Cadence Orcad Capture CIS原理图数据库的基本使用方法与技巧图文教程
  12. 高通QXDM工具使用
  13. Proteus器件查找
  14. 前端css 宠物列表
  15. thinkphp5+php微信公众号二维码扫码关注推广二维码事件实现
  16. 渐变多彩创意双十二活动方案主题PPT
  17. zigzag扫描matlab,Zigzag逆扫描
  18. 5G FWA市场一跃而上,四信多款5G终端赋能FWA典型应用
  19. centos系统 用kubeadm 搭建高可用k8s集群
  20. c++语言的设计与演化pdf,C++语言的设计和演化(高清)pdf

热门文章

  1. 孕妇计算机老师待机房可以吗,微机房辐射对胎儿的影响
  2. python画微信表情_python画微信表情符的实例代码
  3. html/html5学习
  4. 高通Android手机软件开发培训
  5. AMBA总线协议(包含AHB与APB)
  6. PostgreSQL 15 preview -:你了解PostgreSQL GUC 参数吗?
  7. mysql集群方案PXC_【Mysql】MySQL集群方案之PXC(percona xtradb cluster)
  8. Niushop 商品海报
  9. 积分管理系统---系统介绍
  10. 在职场上奋战不懈的各位12把健康金钥匙