举个例子: 使用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有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里是否有方法得到当前连接的用户是什么名字。
我改了一下,哪位大哥帮忙看看,哪里错了?不是太懂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; /
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;
回收权限
SQL>revoke drop any table from user
ORA-01952: system privileges not granted to 'testuser1'
-->另外要看看授予了什么角色,然后收回删除任何表的权限就可以了。
什么角色也没有授予。
只给了一个CREATE SESSION的连接系统权限。
-->grant Select,Insert,Update,Delete on tab to 用户;
试过了,没有出错,但是该用户还是可以Drop Table.
对象全在testuser1下面建,
用户使用testuser2访问,并建好testuser1下面对象的同义词.
然后使用testuser1用户给testuser2赋Select,Insert,Update,Delete权限
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
请问如果DBA需要维护的时候,要删除表怎么办?
把trigger 再去掉?
不好意思,请问“用户使用testuser2访问,并建好testuser1下面对象的同义词”
这句话怎么操作?
本人是客串DB管理,头大!
使用testuser1登陆
grant select on table1 to testuser2;
使用testuser2登陆
create synonym table1 for testuser1.table1;
使用testuser1登陆
赋给testuser2其他的权限
这样,用testuser2登陆,直接操作表名table1(实际上是testuser1.table1的同名) ,就像是操作自己的表一样.同时testuser2对于这张表,没有drop的权限
我明白你的意思了,可是目前的情况是也不允许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里是否有方法得到当前连接的用户是什么名字。
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;
/
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;