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

本文介绍了在正式数据库中控制用户权限的方法,包括建立不同等级的scheme/user并分配相应权限,以及通过触发器阻止用户执行DDL操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

背景:由于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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值