关于用户权限控制一点经验分享下
背景:由于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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/8111049/viewspace-608822/