ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 关于用户权限控制一点经验分享下

关于用户权限控制一点经验分享下

原创 Linux操作系统 作者:haoyuanfen 时间:2009-07-10 12:49:23 0 删除 编辑

关于用户权限控制一点经验分享下

背景:由于Hibernate的到来,在程序开发的阶段,开发人员往往通过工具产生一个自动创建数据库表的脚本.
脚本中首先drop table xxx, 然后再create table xxx .这样的话,可能会带来一些问题.
有时候用户执行脚本的时候,本来想连接测试资料库,但是配置文件中却连的是正式资料库.
这样一执行就把所有正式数据都删除掉了.

(有一点要说明: 一个表是有它的自身schema创建的话,它是可以删除该表的,即使没有drop table权限)
ps. Oracle10g对于drop table会首先放在recycle bin中,你可以做恢復!但是不要使用purge語句,它是不能恢復的!

为了在正式资料库中控制用户的权限,我们可以采用以下方法:
1. 建立不同等级的scheme/user,分配相应的权限
   例如: 1.用户Test
         2.用户Test_dev ,权限只有select on Test.table

2. 在表的Owner的用户中,建立触发器
一下代码来自eygle博客 http://www.eygle.com/archives/2004/12/use_trigger_to_implement_ddl_deny.html
-----------------------------------------
CREATE OR REPLACE TRIGGER TRI_DENY_DDL
BEFORE CREATE OR DROP OR TRUNCATE
ON DATABASE
declare
 l_errmsg varchar2(100):= 'You have no permission to this operation';
begin
 if ora_sysevent = 'CREATE' then
 raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
 elsif ora_sysevent = 'ALTER' then
 raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
 elsif ora_sysevent = 'DROP' then
 raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
 elsif ora_sysevent = 'TRUNCATE' then
 raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
 end if;
 exception
 when no_data_found then
 null;
end;
/

在脚本中我把alter权限去掉了,因为我的procedure经常会变成invaild状态.每次执行的时候都会自动编译一次.
由于我用了上面的trigger,使得procedure执行的时候就报错!

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8111049/viewspace-608822/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-04-02

  • 博文量
    55
  • 访问量
    266339