oracle 限定用户执行ddl命令的权限,即使 某些用户拥有执行ddl命令的权限也会被拦截

本文介绍了一个Oracle数据库中的DDL触发器实现方案,该触发器用于限制特定用户的DDL操作。通过使用RAISE_APPLICATION_ERROR过程,可以在尝试执行未授权的DDL操作时返回自定义错误消息。
CREATE OR REPLACE TRIGGER TR_AUDIT_DDL
   BEFORE DDL ON DATABASE
BEGIN
   IF LOWER(USER)  not in ('tjbb11','sys','tjbb12') --只有这几个用户可以执行ddl命令,其他用户将被拦截


   THEN
      raise_application_error (num      => -20000,
                               msg      =>    'Sorry,You '
                                           || ora_dict_obj_name ()
                                           || ' ?!!!!!'
                                           || 'please contact the DBA'
                              );
   END IF;
END;




---关联函数
create or replace function dictionary_obj_name return varchar2 is
begin
return dbms_standard.dictionary_obj_name;

end;

我们都是通过dbms_output.put_line来输出异常信息,但是在实际的应用中,需要把异常信息返回给调用的客户端。
其实 RAISE_APPLICATION_ERROR 是将应用程序专有的错误从服务器端转达到客户端应用程序(其他机器上的SQLPLUS或者其他前台开发语言)
raise_application_error(异常类型,传递信息)
异常类型:number() 值域:-20000 到-20999
传递信息:varchar2(2000)
DBMS_STANDARD包的RAISE_APPLICATION_ERROR过程,可以重新定义异常错误消息,它为应用程序提供了一种与ORACLE交互的方法。语法如下
RAISE_APPLICATION_ERROR(errorNumber,errorString)
errorNumber是数值在-20000到-20999之间,errorString为自定义的错误信息。
如:
update jobs set job_title = v_newJobTitle where job_id = v_jobid;
if sql%notfound then
   RAISE_APPLICATION_ERROR(-20167,'update failure!');
end if;
..........
当在sqlpus中测试时,一旦没有要更新的行,则抛出这样的异常:
ORA-20167: update failure!
oracle的异常分为编译时异常(错误)和运行时异常,前者不能被处理,后者可以被处理。

datasource: #连接池配置 druid: stat-view-servlet: enabled: true loginUsername: loginPassword: dynamic: primary: centerToSop #设置默认的数据源或者数据源组,默认值即为master strict: false druid: #以下是支持的全局默认值 initialSize: 5 # 最大和最小连接池数量 maxActive: 20 minIdle: 5 #获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。 maxWait: 60000 #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 300000 # 用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。 validationQuery: select 1 #建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效 testWhileIdle: true #申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 testOnBorrow: false #归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 testOnReturn: false #是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。 poolPreparedStatements: true #通过别名的方式配置扩展插件,常用的插件有: 监控统计用的filter:stat日志用的filter:log4j防御sql注入的filter:wall filters: stat, wall filter: wall: config: db-type: clickhouse # 必须显式声明方言 permit-ddl: true # 允许DDL操作(OPTIMIZE属于DDL) permit-variant: true # 允许非标准SQL语法 permit-functions: OPTIMIZE # 函数白名单(大写) 还是报错
最新发布
06-18
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值