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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wrh_csdn/article/details/80708313
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的异常分为编译时异常(错误)和运行时异常,前者不能被处理,后者可以被处理。

猜你喜欢

转载自blog.csdn.net/wrh_csdn/article/details/80708313