请问怎么才能控制用户的Drop Table的权限?

零基础学编程by学哥 IT总监  2005-03-28 05:21:07
因为项目中不希望普通程序员可以去Drop表,怕误操作。所以要实现这个功能。

我新建了一个用户,希望只给它能连接数据库和对Table的Select,Insert,Update,Delete权限,其他任何权限都不要加。

1.用户:testuser1 表领域:默认:USERS 临时:TEMP
2.规则:不设置
3.系统权限:CREATE SESSION
4.Object权限:不设置
5.Consumer Group:不设置
6.Allocation控制:USERS:不限制
7.Proxy user:不设置


但是按照这个设置后,该用户连接后,确实不能Create Table了,但是还是可以Drop Table。


请哪位大大给点提示。
...全文
412 点赞 收藏 18
写回复
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
shz123 2005-03-30
页丁
页丁
回复
luxuezhu 2005-03-30
CREATE OR REPLACE TRIGGER trg_dropdeny
before drop on database
begin
if (sys.login_user!='SYS')
then
raise_application_error(
num=>-20000,
msg=>'You can not delete table ' || ora_dict_obj_name() || ' ! ');
end if;
end;
回复
sunnylkyou 2005-03-29
举个例子:
使用testuser1登陆
grant select on table1 to testuser2;
使用testuser2登陆
create synonym table1 for testuser1.table1;
使用testuser1登陆
赋给testuser2其他的权限
这样,用testuser2登陆,直接操作表名table1(实际上是testuser1.table1的同名) ,就像是操作自己的表一样.同时testuser2对于这张表,没有drop的权限
回复
TO:sunnylkyou()
不好意思,请问“用户使用testuser2访问,并建好testuser1下面对象的同义词”
这句话怎么操作?
本人是客串DB管理,头大!
回复
TO:luxuezhu(卢冲)
请问如果DBA需要维护的时候,要删除表怎么办?
把trigger 再去掉?
回复
luxuezhu 2005-03-29
去掉IF..THEN后就是对整个数据库进行监控,以SYS用户登陆
回复
luxuezhu 2005-03-29
SQL> create or replace trigger trg_dropdeny
2 before drop on database
3 begin
4 if lower(ora_dict_obj_name())='test'
5 then
6 raise_application_error(
7 num=>-20000,
8 msg=>'你疯了,想删除表'||ora_dict_obj_name()||'?!!!'||'你完了,警察来抓
你了...');
9 end if;
10 end;
11 /

触发器已创建

SQL> create table test(a number);

表已创建。

SQL> drop table test;
drop table test
*
ERROR 位于第 1 行:
ORA-00604: 递归 SQL 层 1 出现错误
ORA-20000: 你疯了,想删除表TEST?!!!你完了,警察来抓你了...
ORA-06512: 在line 4

回复
sunnylkyou 2005-03-29
的确,同义词就可以解决这个问题了!

建两个用户testuser1,testuser2
对象全在testuser1下面建,
用户使用testuser2访问,并建好testuser1下面对象的同义词.
然后使用testuser1用户给testuser2赋Select,Insert,Update,Delete权限
回复
zhj9811220 2005-03-29
可以建同义词两个库共享一个表的数据
回复
TO:binkou(查有此人)

-->grant Select,Insert,Update,Delete on tab to 用户;


试过了,没有出错,但是该用户还是可以Drop Table.
回复
TO:waxle(清风居士)

-->另外要看看授予了什么角色,然后收回删除任何表的权限就可以了。

什么角色也没有授予。
只给了一个CREATE SESSION的连接系统权限。
回复
TO:zhaokeke2004(男人·海洋)
回收权限
SQL>revoke drop any table from user


ORA-01952: system privileges not granted to 'testuser1'
回复
我改了一下,哪位大哥帮忙看看,哪里错了?不是太懂PL/SQL。

CREATE OR REPLACE TRIGGER trg_dropdeny
before drop on database
begin
v_username VARCHAR2(100);
select username into v_username from user_users;

if (lower(ora_dict_obj_name())='t1') and (v_username='tetra0')
then
raise_application_error(
num=>-20000,
msg=>'You can not delete table ' || ora_dict_obj_name() || ' ! ');
end if;
end;
/
回复
TO:sunnylkyou()
我明白你的意思了,可是目前的情况是也不允许testuser2有synonym 权限,该怎么办?


TO:luxuezhu(卢冲)
你的方法很好,可是能不能让DBA还是能够Drop Table ?
比如:
SQL> create or replace trigger trg_dropdeny
2 before drop on database
3 begin
4 if lower(ora_dict_obj_name())='test' and getConnectUserName()='testuser1'
5 then
6 raise_application_error(
7 num=>-20000,
8 msg=>'你疯了,想删除表'||ora_dict_obj_name()||'?!!!'||'你完了,警察来抓
你了...');
9 end if;
10 end;
11 /


里面的getConnectUserName是我自己加的。我不太清楚Oracle里是否有方法得到当前连接的用户是什么名字。
回复
waxle 2005-03-28
另外要看看授予了什么角色,然后收回删除任何表的权限就可以了。
回复
binkou 2005-03-28
grant Select,Insert,Update,Delete on tab to 用户;
回复
zhaokeke2004 2005-03-28
回收权限
SQL>revoke drop any table from user
回复
有谁能指点一二?
回复
发动态
发帖子
基础和管理
创建于2007-09-28

1.7w+

社区成员

Oracle 基础和管理
申请成为版主
社区公告
暂无公告